Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Strzelanie do obiektu

Ostatnio zmodyfikowano 2013-05-02 11:10
Autor Wiadomość
kubek3898
Temat założony przez niniejszego użytkownika
Strzelanie do obiektu
» 2013-05-01 15:02:33
Mam taki kod:

C/C++
#include <allegro.h>

BITMAP * man_1 = NULL;
BITMAP * man_2 = NULL;
BITMAP * bufor = NULL;
BITMAP * bg = NULL;
BITMAP * all_1 = NULL;
BITMAP * all_2 = NULL;
SAMPLE * misc = NULL;

volatile long speed = 0;

void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );

class Human
{
public:
    short int x, y;
    short int s, w;
};

bool czy_strzela_1 = false;
bool czy_strzela_2 = false;

bool collision( int x_1, int y_1, int s_1, int w_1, int x_2, int y_2, int s_2, int w_2 )
{
    if( x_2 <= x_1 + s_1 && x_2 > x_1 && y_2 >= y_1 && y_2 <= y_1 + w_1 ) return true;
    else if( x_2 <= x_1 + s_1 && x_2 > x_1 && y_2 + w_2 >= y_1 && y_2 + w_2 <= y_1 + w_1 ) return true;
    else if( x_2 + s_2 <= x_1 + s_1 && x_2 + s_2 > x_1 && y_2 >= y_1 && y_2 <= y_1 + w_1 ) return true;
    else if( x_2 + s_2 <= x_1 + s_1 && x_2 + s_2 > x_1 && y_2 + w_2 >= y_1 && y_2 + w_2 <= y_1 + w_1 ) return true;
    else return false;
   
};
END_OF_FUNCTION( collision );

Human human_1, human_2, ball_1, ball_2;

void load_bufor()
{
    bufor = create_bitmap( 640, 480 );
   
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_bufor );

void load_sound()
{
    misc = load_sample( "sounds/start.wav" );
   
    if( !misc )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę załadować dźwięku!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_sound );

void load_human()
{
    man_1 = load_bmp( "images/human_1.bmp", default_palette );
   
    if( !man_1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Grafika nie została wczytana!" );
        allegro_exit();
    }
   
    man_2 = load_bmp( "images/human_2.bmp", default_palette );
   
    if( !man_2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Grafika nie została wczytana!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_human );

void load_bg()
{
    bg = load_bmp( "images/bg.bmp", default_palette );
   
    if( !bg )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Tło nie zostało wczytane" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_bg );

void load_ball()
{
    all_1 = load_bmp( "images/ball_1.bmp", default_palette );
   
    if( !all_1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Kulka nie została wczytana!" );
        allegro_exit();
    }
   
    all_2 = load_bmp( "images/ball_2.bmp", default_palette );
   
    if( !all_2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Kulka nie została wczytana!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_ball );

LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
    allegro_init();
   
    install_keyboard();
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
   
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 300 ) );
   
    load_bufor();
    load_bg();
    load_human();
    load_ball();
   
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
    load_sound();
    play_sample( misc, 255, 127, 1000, 1 );
   
    int bg_x = 0, bg_y = 0;
   
    human_1.x = 100, human_1.y = 100, human_1.s = 40, human_1.w = 40;
    human_2.x = 100, human_2.y = 400, human_2.s = 40, human_2.w = 40;
   
    ball_1.x = human_1.x;
    ball_1.y = human_1.y;
    ball_1.s = 5;
    ball_1.w = 5;
   
    ball_2.x = human_2.x;
    ball_2.y = human_2.y;
    ball_2.s = 5;
    ball_2.w = 5;
   
    int czy_1 = false;
    int czy_2 = false;
   
    while( !key[ KEY_ESC ] )
    {
        if( czy_strzela_1 == true )
        {
            ball_1.y = ball_1.y - 3;
           
            if( collision( human_2.x, human_2.y, human_2.s, human_2.w, ball_1.x, ball_1.y, ball_1.s, ball_1.w ) )
            {
                czy_1 = true;
               
                ball_1.x = human_2.x;
                ball_1.y = human_2.y;
               
                czy_strzela_1 = false;
            }
            if( ball_1.y < human_2.y - 70 )
            {
                ball_1.x = human_2.x;
                ball_1.y = human_2.y;
                ball_1.y--;
               
                czy_strzela_1 = false;
               
                ball_1.y = human_2.y;
            }
        }
       
        if( czy_strzela_2 == true )
        {
            // Kod
        }
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] )
            {
                human_1.x--;
                ball_1.x--;
            }
            if( key[ KEY_RIGHT ] )
            {
                human_1.x++;
                ball_1.x++;
            }
            if( key[ KEY_UP ] )
            {
                czy_strzela_1 = true;
            }
            if( key[ KEY_A ] )
            {
                human_2.x--;
                ball_2.x--;
            }
            if( key[ KEY_D ] )
            {
                human_2.x++;
                ball_2.x++;
            }
            if( key[ KEY_W ] )
            {
                czy_strzela_2 = true;
            }
            if( human_1.x == - 32 ) human_1.x = 608; ball_1.x = human_1.x;
            if( human_1.x == 610 ) human_1.x = - 30; ball_1.x = human_1.x;
            if( human_2.x == - 32 ) human_2.x = 608; ball_2.x = human_2.x;
            if( human_2.x == 610 ) human_2.x = - 30; ball_2.x = human_2.x;
           
            speed--;
        }
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
       
        masked_blit( bg, bufor, 0, 0, bg_y, bg_y, bg->w, bg->h );
       
        masked_blit( man_1, bufor, 0, 0, human_1.x, human_1.y, human_1.s, human_1.w );
        masked_blit( man_2, bufor, 0, 0, human_2.x, human_2.y, human_2.s, human_2.w );
        masked_blit( all_1, bufor, 0, 0, ball_1.x, ball_1.y, ball_1.s, ball_1.w );
        masked_blit( all_2, bufor, 0, 0, ball_2.x, ball_2.y, ball_2.s, ball_2.w );
       
        if( czy_1 == true )
        {
            // info
        }
        if( czy_2 == true )
        {
            // info 2
        }
       
        textprintf( bufor, font, 20, 20, makecol( 255, 255, 128 ), "Pozycja X ludzika (I): %d", human_1.x );
        textprintf( bufor, font, 20, 40, makecol( 255, 255, 128 ), "Pozycja Y ludzika (I): %d", human_1.y );
        textprintf( bufor, font, 420, 20, makecol( 255, 255, 128 ), "Pozycja X ludzika (II): %d", human_2.x );
        textprintf( bufor, font, 420, 40, makecol( 255, 255, 128 ), "Pozycja Y ludzika (II): %d", human_2.y );
    }
   
    clear_keybuf();
   
    remove_int( increment_speed );
   
    stop_sample( misc );
    destroy_bitmap( man_1 );
    destroy_bitmap( man_2 );
    destroy_bitmap( bufor );
    destroy_bitmap( bg );
    destroy_bitmap( all_1 );
    destroy_bitmap( all_2 );
    destroy_sample( misc );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Problem mam z tą częścią kodu:

C/C++
if( czy_strzela_1 == true )
{
    ball_1.y = ball_1.y - 3;
   
    if( collision( human_2.x, human_2.y, human_2.s, human_2.w, ball_1.x, ball_1.y, ball_1.s, ball_1.w ) )
    {
        czy_1 = true;
       
        ball_1.x = human_2.x;
        ball_1.y = human_2.y;
       
        czy_strzela_1 = false;
    }
    if( ball_1.y < human_2.y - 70 )
    {
        ball_1.x = human_2.x;
        ball_1.y = human_2.y;
        ball_1.y--;
       
        czy_strzela_1 = false;
       
        ball_1.y = human_2.y;
    }
}

Mianowicie jak zrobić prostą animację strzelania? Powyższy kod, daje mi całkowicie odwrotny skutek - kulka leci lecz jak, by tylko połowę swojej drogi + nie od tej postaci ^^ (czyli kulka wystrzelona z postaci numer 1, tak naprawdę zostaje wystrzelona z postaci nr 2).
P-81704
DejaVu
» 2013-05-01 16:25:34
To ustaw pozycję początkową pocisku na właściwą postać.
P-81715
kubek3898
Temat założony przez niniejszego użytkownika
» 2013-05-02 11:10:55
Okej, jak zwykle przez mój pośpiech ustawiłem pozycję pocisku 2 na ludziku 1 i odwrotnie stąd te problemy.

/cl
P-81773
« 1 »
  Strona 1 z 1