wojownik266 Temat założony przez niniejszego użytkownika |
[Allegro] Kolizja z ruchomym pociskiem » 2010-05-26 20:27:24 Po paru dniach udało mi się wypocić kawałek kosmicznej strzelanki, której kod prezentuję nieco niżej i jednocześnie zapytuję; Dlaczego ta paskudna kolizja nie chce zadziałać. Mógłby ktoś coś doradzić lub nieco poprawić? Tak aby kolizja zadziałała? Please help my!!! #include <allegro.h> #include <vector> using std::vector;
BITMAP * bufor = NULL; BITMAP * background = NULL; BITMAP * statek = NULL; BITMAP * pocisk = 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(); void pozycja_ufo( int & x, int & y ); void pocisk_strzal( int & pocx, int & pocy ); };
Bohater::Bohater() { spodki.reserve( 10 ); }
Bohater::~Bohater() { }
void Bohater::pozycja_ufo( int & x, int & y ) { if( x < 640 ) { x += 2; } if( x >= 640 ) { x = 0; y = 0; } k++; if( k == 256 ) k = 0; masked_blit( spodki[ 0 ], bufor, 0, 0, x, y, spodki[ 0 ]->w, spodki[ 0 ]->h ); masked_blit( spodki[ 1 ], bufor, 0, 0, x - 40, y, spodki[ 1 ]->w, spodki[ 1 ]->h ); }
void Bohater::pocisk_strzal( int & pocx, int & pocy ) { if( pocy < 480 ) { pocy -= 15; } if( pocy <= 0 ) { pocy = 420; } pocy--; create_bitmap( pocisk->w, pocisk->h ); masked_blit( pocisk, bufor, 0, 0, pocx, pocy, pocisk->w, pocisk->h ); } bool kolizja1( 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( 100 ) ); detect_digi_driver( DIGI_AUTODETECT ); detect_midi_driver( MIDI_AUTODETECT ); install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, NULL ); Bohater boh, wrog, pocisk0; wrog.x = 0, wrog.y = 0, wrog.s = 40, wrog.w = 40; pocisk0.x = 320, pocisk0.y = 420, pocisk0.s = 40, pocisk0.w = 40; muzyczka = load_midi( "muzyczka.mid" ); bufor = create_bitmap( 640, 480 ); background = load_bmp( "glob.bmp", default_palette ); statek = load_bmp( "statek.bmp", NULL ); pocisk = load_bmp( "pocisk.bmp", NULL ); boh.spodki[ 0 ] = load_bmp( "spodek.bmp", NULL ); boh.spodki[ 1 ] = load_bmp( "spodek.bmp", NULL ); boh.spodki; int x = 0, y = 0; int pozsx = 320, pozsy = 420; int pociskx = 320, pocisky = 420; play_midi( muzyczka, 1 ); while( !key[ KEY_ESC ] ) { clear_to_color( bufor, makecol( 0, 0, 0 ) ); blit( background, bufor, 0, 0, 0, 0, background->w, background->h ); while( speed > 0 ) { if( key[ KEY_LEFT ] ) { pozsx -= 2; pociskx -= 2; } if( key[ KEY_RIGHT ] ) { pozsx += 2; pociskx += 2; } if( key[ KEY_SPACE ] ) { boh.pocisk_strzal( pociskx, pocisky ); } speed--; } if( kolizja1( wrog.x, wrog.y, wrog.s, wrog.w, pocisk0.x, pocisk0.y, pocisk0.s, pocisk0.w ) == true ) { allegro_message( "Kolizja" ); } boh.pozycja_ufo( x, y ); masked_blit( statek, bufor, 0, 0, pozsx, pozsy, statek->w, statek->h ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } destroy_bitmap( boh.spodki[ 0 ] ); destroy_bitmap( bufor ); destroy_bitmap( background ); destroy_bitmap( pocisk ); allegro_exit(); return 0; } END_OF_MAIN(); |