kubek3898 Temat założony przez niniejszego użytkownika |
Strzelanie do obiektu » 2013-05-01 15:02:33 Mam taki kod: #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 ) { } 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 ) { } if( czy_2 == true ) { } 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: 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). |