wojownik266 Temat założony przez niniejszego użytkownika |
[Allegro] kosmiczna strzelanka » 2010-06-03 14:03:47 Mam już napisany kawałek gry, która zachowuje się tak jak sobie to zaplanowałem. statki(wrogowie) poruszają się z góry na dół a statek (bohater) porusza się w pozimie z lewej do prawej i na odwrót oddając przy tym strzały (po nacisnieciu spacji), i wszystko niby jest okey poza takim mankamentem że po zajsciu kolizji pocisku z wrogim statkiem następuje kolizja która się nie kończy bo kiedy statek wroga znajduje się jeszcze u góry ekranu a statek bohater na lini jego lotu (toru lotu), następuje znowu kolizja... Co zrobić aby kolizja następowała tylko po oddaniu strzału i trafieniu pociskiem wrogiego statku? Ani wcześniej ani później? Poniżej kod programu a tutaj link do kodu źródłowego (załącznika) i grafik: http://www.easykoder.vot.pl/forum/showthread.php?tid=152Prawie na samym dole:"kosmiczna strzelanka". #include <allegro.h> #include <vector>
using std::vector;
BITMAP * bufor = NULL; BITMAP * niebo = NULL; BITMAP * niebo1 = NULL; BITMAP * statek = NULL; BITMAP * pocisk = NULL; SAMPLE * laser = NULL; MIDI * muzyczka;
volatile long int speed = 0; volatile long int k = 0;
void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_VARIABLE( k );
class Bohater { public: int poz_x, poz_y; short int x, y; short int s, w; vector < BITMAP *> spodki; Bohater(); ~Bohater(); };
Bohater::Bohater() { spodki.reserve( 10 ); }
Bohater::~Bohater() { }
bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 ) { if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true ); return( false ); };
int main() { allegro_init(); install_keyboard(); install_timer(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 ); install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); detect_digi_driver( DIGI_AUTODETECT ); detect_midi_driver( MIDI_AUTODETECT ); install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, NULL ); Bohater boh, wrog[ 10 ], pocisk0[ 10 ]; muzyczka = load_midi( "muzyczka.mid" ); laser = load_sample( "laser.wav" ); bufor = create_bitmap( 640, 480 ); niebo = load_bmp( "glob.bmp", default_palette ); niebo1 = load_bmp( "glob.bmp", default_palette ); statek = load_bmp( "statek.bmp", NULL ); pocisk = load_bmp( "pocisk.bmp", NULL ); for( int i = 0; i < 10; ++i ) boh.spodki[ i ] = load_bmp( "spodek.bmp", NULL ); boh.x = 320, boh.y = 420; int pociskx = 320, pocisky = 420; int pozsx = 320, pozsy = 420; for( int i = 0; i < 10; ++i ) { wrog[ i ].x = 40; wrog[ i ].y = 40; wrog[ i ].s = 40; wrog[ i ].w = 40; } pocisk0[ 0 ].x = 320, pocisk0[ 0 ].y = 420, pocisk0[ 0 ].w = 40, pocisk0[ 0 ].s = 40; int niebo_x = 0, niebo_y = 0; int niebo1_x = 0, niebo1_y = 0; int niebo2_x = 0, niebo2_y = 0; int mapa_y = 0, ekran_y = 480; int obraz_y = ekran_y; play_midi( muzyczka, 1 ); while( !key[ KEY_ESC ] ) { clear_to_color( bufor, makecol( 0, 0, 0 ) ); niebo_y = - mapa_y % ekran_y; niebo1_y = ekran_y - mapa_y % ekran_y; mapa_y++; blit( niebo, bufor, 0, 0, niebo_x, niebo_y, niebo->w, niebo->h ); blit( niebo1, bufor, 0, 0, niebo1_x, niebo1_y, niebo1->w, niebo1->h ); while( speed > 0 ) { if( key[ KEY_LEFT ] ) { pozsx -= 2; pocisk0[ 0 ].x -= 2; } if( key[ KEY_RIGHT ] ) { pozsx += 2; pocisk0[ 0 ].x += 2; } if( key[ KEY_SPACE ] ) { for( int i = 0; i <= 10; ++i ) { if( pocisk0[ i ].y < 480 ) { pocisk0[ i ].y -= 15; } if( pocisk0[ i ].y <= 0 ) { pocisk0[ i ].y = 420; } pocisk0[ i ].y--; } create_bitmap( pocisk->w, pocisk->h ); masked_blit( pocisk, bufor, 0, 0, pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w ); } speed--; } for( int i = 0; i < 10; ++i ) { if( wrog[ i ].y < 480 ) { wrog[ i ].y += 2; } else if( wrog[ i ].y >= 480 ) { wrog[ i ].x = 20; wrog[ i ].y = 20; } } k++; if( k == 256 ) k = 0; masked_blit( boh.spodki[ 0 ], bufor, 0, 0, wrog[ 0 ].x = 200, wrog[ 0 ].y + 40, wrog[ 0 ].s, wrog[ 0 ].w ); masked_blit( boh.spodki[ 1 ], bufor, 0, 0, wrog[ 1 ].x = 280, wrog[ 1 ].y + 120, wrog[ 1 ].s, wrog[ 1 ].w ); masked_blit( boh.spodki[ 2 ], bufor, 0, 0, wrog[ 2 ].x = 360, wrog[ 2 ].y + 40, wrog[ 2 ].s, wrog[ 2 ].w ); masked_blit( statek, bufor, 0, 0, pozsx, pozsy, statek->w, statek->h ); if( kolizja( pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w, wrog[ 0 ].x, wrog[ 0 ].y, wrog[ 0 ].s, wrog[ 0 ].w ) == true ) { textprintf_ex( bufor, font, 0, 460, makecol( 255, 255, 0 ), - 1, "Kolizja 0" ); play_sample( laser, 2000, 1000, 255, 0 ); } if( kolizja( pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w, wrog[ 1 ].x, wrog[ 1 ].y, wrog[ 1 ].s, wrog[ 1 ].w ) == true ) { textprintf_ex( bufor, font, 0, 460, makecol( 155, 155, 0 ), - 1, "Kolizja 1" ); play_sample( laser, 2000, 1000, 255, 0 ); } if( kolizja( pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w, wrog[ 2 ].x, wrog[ 2 ].y, wrog[ 2 ].s, wrog[ 2 ].w ) == true ) { textprintf_ex( bufor, font, 0, 460, makecol( 255, 255, 255 ), - 1, "Kolizja 2" ); play_sample( laser, 2000, 1000, 255, 0 ); } blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } for( int i = 0; i < 10; ++i ) destroy_bitmap( boh.spodki[ i ] ); destroy_bitmap( bufor ); destroy_bitmap( niebo ); destroy_bitmap( pocisk ); destroy_sample( laser ); allegro_exit(); return 0; } END_OF_MAIN(); |