wojownik266 Temat założony przez niniejszego użytkownika |
[Allegro] Ukrywanie mapy - kafelka » 2009-08-24 14:56:29 Witam. Jestem w trakcie pisania gierki do której z mapy wczytuję kafelki, które to kafelki przewijają się u góry ekranu z prawej do lewej. Następnie strzelam do tych kafelków bitmapą pocisk i wszystko jest niby ok. Kiedy pociskiem trafiam w kafelek to ten powinien zniknąć i tu mam problem bo nie wiem jak to zrobić zeby własnie ten trafiony kafelek zniknął a pozostałe pozostały na swoich miejscach. Chodzi mi głownie o rozwiazanie problemu ze znikaniem. Poniżej prezentuję moje wypociny: #include <allegro.h>
BITMAP * bufor = NULL; BITMAP * statek = NULL; BITMAP * puszka = NULL; BITMAP * chmury = NULL; BITMAP * pocisk = NULL; SAMPLE * strzal = NULL; SAMPLE * kolizja = NULL;
class bohater { public: short int x, y, s, w; }; bohater pocisk1, puszka1[ 4 ][ 18 ];
int pozc_x = 0, pozc_y = 0; int statek_x = 320, statek_y = 420;
int mapa_x = 0, mapa_y = 0, wx = 0;
short int map[ 4 ][ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }; 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 ); };
void wys_mape( int num ) { int licznik_x, licznik_y; for( licznik_x = 0; licznik_x < 18; licznik_x++ ) { for( licznik_y = 0; licznik_y < 4; licznik_y++ ) { if( map[ licznik_y ][ licznik_x ] == num ) { masked_blit( puszka, bufor, 0, 0,( licznik_x * 40 ) - wx, licznik_y * 40, 40, 40 ); masked_blit( puszka, bufor, 0, 0,(( licznik_x * 40 ) + screen->w ) - wx, licznik_y * 40, 40, 40 ); } } } wx++; if( wx >= screen->w ) wx = 0; };
volatile long speed = 0;
void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int main() { allegro_init(); install_keyboard(); install_timer(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) ); install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, " " ); bufor = create_bitmap( 640, 480 ); puszka = load_bmp( "puszka.bmp", default_palette ); chmury = load_bmp( "chmury.bmp", default_palette ); statek = load_bmp( "statek.bmp", default_palette ); pocisk = load_bmp( "pocisk.bmp", default_palette ); strzal = load_sample( "strzal.wav" ); kolizja = load_sample( "kolizja.wav" ); pocisk1.x = 320; pocisk1.y = 420; pocisk1.s = 40; pocisk1.w = 40; puszka1[ 4 ][ 18 ].x = 40; puszka1[ 4 ][ 18 ].y = 40; puszka1[ 4 ][ 18 ].s = 40; puszka1[ 4 ][ 18 ].w = 40; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_RIGHT ] ) { statek_x += 3; pocisk1.x += 3; } if( key[ KEY_LEFT ] ) { statek_x -= 3; pocisk1.x -= 3; } if( key[ KEY_SPACE ] ) { masked_blit( pocisk, bufor, 0, 0, pocisk1.x, pocisk1.y, pocisk1.s, pocisk1.w ); pocisk1.y -= 2; if( pocisk1.y < 0 ) pocisk1.y = 400; } mapa_x--; if(( mapa_x +( puszka->h ) ) == 0 ) mapa_x = 0; speed--; } clear_to_color( bufor, makecol( 0, 0, 0 ) ); masked_blit( chmury, bufor, 0, 0, pozc_x, pozc_y, chmury->w, chmury->h ); masked_blit( statek, bufor, 0, 0, statek_x, statek_y, statek->w, statek->h ); masked_blit( pocisk, bufor, 0, 0, pocisk1.x, pocisk1.y -= 3, pocisk1.s, pocisk1.w ); wys_mape( 0 ); masked_blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); for( int i = 0; i <= 4; i++ ) for( int j = 0; j <= 18; j++ ) if( kolizja1( pocisk1.x, pocisk1.y, pocisk1.s, pocisk1.w, puszka1[ i ][ j ].x, puszka1[ i ][ j ].y, puszka1[ i ][ j ].s, puszka1[ i ][ j ].w ) == true ) { map[ i ][ j ] = 2; play_sample( kolizja, 60, 255, 1000, 0 ); } } destroy_bitmap( bufor ); destroy_bitmap( statek ); destroy_bitmap( pocisk ); destroy_bitmap( chmury ); remove_int( increment_speed ); allegro_exit(); return 0; } END_OF_MAIN();
Najwięcej problemu sprawia mi poniższy kod z którym niepotrafię sobie jak narazie samemu poradzić. Proszę o pomoc w rozwiazaniu tego problemu. for( int i = 0; i <= 4; i++ ) for( int j = 0; j <= 18; j++ ) if( kolizja1( pocisk1.x, pocisk1.y, pocisk1.s, pocisk1.w, puszka1[ i ][ j ].x, puszka1[ i ][ j ].y, puszka1[ i ][ j ].s, puszka1[ i ][ j ].w ) == true ) { map[ i ][ j ] = 2; play_sample( kolizja, 60, 255, 1000, 0 ); }
|