Camper Temat założony przez niniejszego użytkownika |
[Allegro] Bufory » 2009-05-17 19:35:42 Witam. Poczytałem trochę po forum i dowiedziałem się pewnych rzeczy, jednak że nadal mam problemy. Otóż, piszę grę, na razie polega na tym że są 2 statki, 1 steruje się na wsad, drugim na strzałkach, do tego się strzela i jak się trafia to generuje dźwięk. Dosyć prosty jednak mam problemy z płynnością gry, czy moglibyście mi powiedzieć jak powinno wyglądać rozłożenie na bufory ? Otóż chodzi mi o tło <-mruga jak strzelam statki też mrugają jak strzelam, Chcę wiedzieć jak umieścić na buforach strzały, statki, tło ponieważ nie chodzi to płynnie. Następny problem sprawiało poruszanie się w trakcie strzału, otóż jak strzał leciał to x i y statku się zmieniały ale nie wyświetlało tego bo było na etapie pętli wyświetlania strzału, dopiero po tym jak strzał znikał, statek pojawiał się w miejscu gdzie powinien być. (wymyśliłem że dam sterowanie do tej pętli ale to chyba nie zbyt dobre rozwiązanie bo teraz jak lecę i strzelam to przy strzale robi przeskok i pojawia się dalej) to fragment kodu który prawdopodobnie stwarza problemy : (jestem bardzo początkujący[2 dni] i dlatego tam taki bałagan.) while( !key[ KEY_ESC ] ) { frame++; if( frame > 40 ) frame = 0; while( speed > 0 ) { if( key[ KEY_A ] ) enemy_x = enemy_x - 11; if( key[ KEY_D ] ) enemy_x = enemy_x + 11; if( key[ KEY_W ] ) enemy_y = enemy_y - 11; if( key[ KEY_S ] ) enemy_y = enemy_y + 11; if( key[ KEY_C ] ) { int strzal_x = enemy_x + 10, strzal_y = enemy_y + 10, strzal_s = 25, strzal_w = 25; while( strzal_y < 600 ) { if( key[ KEY_A ] ) enemy_x = enemy_x - 11; if( key[ KEY_D ] ) enemy_x = enemy_x + 11; if( key[ KEY_W ] ) enemy_y = enemy_y - 11; if( key[ KEY_S ] ) enemy_y = enemy_y + 11; if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); } else { draw_sprite( bufor2, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } if( frame < 20 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); } else { draw_sprite( bufor2, statek, statek_x, statek_y ); } if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } blit( bufor2, screen, 0, 0, 0, 0, 800, 600 ); strzal_y = strzal_y + 10; clear_to_color( bufor2, makecol( 150, 150, 150 ) ); if( kolizja( statek_x, statek_y, statek_s, statek_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true ) { play_sample( dzwiek, 255, 127, 3000, 0 ); } } } if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; if( key[ KEY_M ] ) { int strzal_x = statek_x + 10, strzal_y = statek_y + 10, strzal_s = 25, strzal_w = 25; while( strzal_y > 1 ) { if( key[ KEY_A ] ) enemy_x = enemy_x - 11; if( key[ KEY_D ] ) enemy_x = enemy_x + 11; if( key[ KEY_W ] ) enemy_y = enemy_y - 11; if( key[ KEY_S ] ) enemy_y = enemy_y + 11; if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); } else { draw_sprite( bufor2, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); } else { draw_sprite( bufor2, statek, statek_x, statek_y ); } if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } blit( bufor2, screen, 0, 0, 0, 0, 800, 600 ); clear_to_color( bufor2, makecol( 150, 150, 150 ) ); strzal_y = strzal_y - 10; if( kolizja( enemy_x, enemy_y, enemy_s, enemy_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true ) { play_sample( dzwiek, 255, 127, 3000, 0 ); } if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; } } speed--; } clear_to_color( bufor, makecol( 255, 0, 255 ) ); if( enemy_x < 0 ) { enemy_x = 800; } if( enemy_y < 0 ) { enemy_y = 600; } if( enemy_x > 800 ) { enemy_x = 0; } if( enemy_y > 600 ) { enemy_y = 0; } if( statek_x < 0 ) { statek_x = 800; } if( statek_y < 0 ) { statek_y = 600; } if( statek_x > 800 ) { statek_x = 0; } if( statek_y > 600 ) { statek_y = 0; } if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); } else { draw_sprite( bufor, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); } else { draw_sprite( bufor, statek, statek_x, statek_y ); } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } |
Camper Temat założony przez niniejszego użytkownika |
» 2009-05-18 10:16:30 Z problemem przeskakiwania już sobie poradziłem, jednak teraz jest następny, jak zrobić tak żeby oba obiekty mogły strzelać równocześnie. W tej chwili jak naciskam przycisk strzału jednego obiektu, i równocześnie nacisnę przycisk drugiego to tylko ten pierwszy widać, i jak on doleci do końca pokazuje się ten drugi. Podejrzewam że jest to wynikiem oczyszczania bufora po każdym przesunięciu pierwszego strzały dlatego też drugiego nie widać, jednak nie jestem pewien i nie wiem jak to rozwiązać. Umieściłem strzały na innych buforach ale nie działa za bardzo. Zamieszczę cały kod żebyście to mogli sprawdzić. class Cpostac { public: short int x, y; short int s, w; };
bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 ) { if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else return false; };
Cpostac statek, enemy; #include <allegro.h> 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(); set_color_depth( 24 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) ); install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" ); set_volume( 255, 255 ); BITMAP * bufor = NULL; BITMAP * bufor2 = NULL; BITMAP * bufor3 = NULL; BITMAP * statek = NULL; BITMAP * strzal = NULL; BITMAP * enemy = NULL; SAMPLE * dzwiek = NULL; BITMAP * bmp = NULL; bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } bufor2 = create_bitmap( 800, 600 ); if( !bufor2 ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } bufor3 = create_bitmap( 800, 600 ); if( !bufor2 ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } dzwiek = load_sample( "tyk.wav" ); if( !dzwiek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować dzwieku !" ); allegro_exit(); return 0; } bmp = load_bmp( "tlo.bmp", default_palette ); masked_blit( bmp, bufor2, 0, 0, 0, 0, bmp->w, bmp->h ); blit( bufor2, screen, 0, 0, 0, 0, 800, 600 ); enemy = load_bmp( "enemy.bmp", default_palette ); int enemy_x = 425, enemy_y = 100, enemy_s = 50, enemy_w = 50; statek = load_bmp( "statek.bmp", default_palette ); int statek_x = 400, statek_y = 300, statek_s = 50, statek_w = 50; strzal = load_bmp( "strzal.bmp", default_palette ); int strzal_x = statek_x, strzal_y = statek_y, strzal_s = 25, strzal_w = 25; int frame = 0; int i; while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; if( key[ KEY_A ] ) enemy_x = enemy_x - 2; if( key[ KEY_D ] ) enemy_x = enemy_x + 2; if( key[ KEY_W ] ) enemy_y = enemy_y - 2; if( key[ KEY_S ] ) enemy_y = enemy_y + 2; frame++; if( frame > 40 ) frame = 0; while( speed > 0 ) { if( key[ KEY_C ] ) { int strzal_x = enemy_x + 10, strzal_y = enemy_y + 10, strzal_s = 25, strzal_w = 25; while( strzal_y < 600 ) { if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); } else { draw_sprite( bufor2, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } if( frame < 20 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); } else { draw_sprite( bufor2, statek, statek_x, statek_y ); } if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } blit( bufor2, screen, 0, 0, 0, 0, 800, 600 ); strzal_y = strzal_y + 10; clear_to_color( bufor2, makecol( 150, 150, 150 ) ); if( kolizja( statek_x, statek_y, statek_s, statek_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true ) { play_sample( dzwiek, 255, 127, 3000, 0 ); } if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; if( key[ KEY_A ] ) enemy_x = enemy_x - 2; if( key[ KEY_D ] ) enemy_x = enemy_x + 2; if( key[ KEY_W ] ) enemy_y = enemy_y - 2; if( key[ KEY_S ] ) enemy_y = enemy_y + 2; if( key[ KEY_M ] ) { int strzal_x = statek_x + 10, strzal_y = statek_y + 10, strzal_s = 25, strzal_w = 25; while( strzal_y > 1 ) { if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); } else { draw_sprite( bufor, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); } else { draw_sprite( bufor, statek, statek_x, statek_y ); } if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } if( frame < 40 ) { draw_sprite( bufor, strzal, strzal_x, strzal_y ); } else { draw_sprite( bufor, strzal, strzal_x, strzal_y ); } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); clear_to_color( bufor, makecol( 150, 150, 150 ) ); strzal_y = strzal_y - 10; if( kolizja( enemy_x, enemy_y, enemy_s, enemy_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true ) { play_sample( dzwiek, 255, 127, 3000, 0 ); } if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; if( key[ KEY_A ] ) enemy_x = enemy_x - 2; if( key[ KEY_D ] ) enemy_x = enemy_x + 2; if( key[ KEY_W ] ) enemy_y = enemy_y - 2; if( key[ KEY_S ] ) enemy_y = enemy_y + 2; } } } } if( key[ KEY_M ] ) { int strzal_x = statek_x + 10, strzal_y = statek_y + 10, strzal_s = 25, strzal_w = 25; while( strzal_y > 1 ) { if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); } else { draw_sprite( bufor, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); } else { draw_sprite( bufor, statek, statek_x, statek_y ); } if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } if( frame < 40 ) { draw_sprite( bufor, strzal, strzal_x, strzal_y ); } else { draw_sprite( bufor, strzal, strzal_x, strzal_y ); } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); clear_to_color( bufor, makecol( 150, 150, 150 ) ); strzal_y = strzal_y - 10; if( kolizja( enemy_x, enemy_y, enemy_s, enemy_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true ) { play_sample( dzwiek, 255, 127, 3000, 0 ); } if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; if( key[ KEY_A ] ) enemy_x = enemy_x - 2; if( key[ KEY_D ] ) enemy_x = enemy_x + 2; if( key[ KEY_W ] ) enemy_y = enemy_y - 2; if( key[ KEY_S ] ) enemy_y = enemy_y + 2; if( key[ KEY_C ] ) { int strzal_x = enemy_x + 10, strzal_y = enemy_y + 10, strzal_s = 25, strzal_w = 25; while( strzal_y < 600 ) { if( frame < 40 ) { draw_sprite( bufor2, bmp, 0, 0 ); } else { draw_sprite( bufor2, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor2, enemy, enemy_x, enemy_y ); } if( frame < 20 ) { draw_sprite( bufor2, statek, statek_x, statek_y ); } else { draw_sprite( bufor2, statek, statek_x, statek_y ); } if( frame < 40 ) { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } else { draw_sprite( bufor2, strzal, strzal_x, strzal_y ); } blit( bufor2, screen, 0, 0, 0, 0, 800, 600 ); strzal_y = strzal_y + 10; clear_to_color( bufor2, makecol( 150, 150, 150 ) ); if( kolizja( statek_x, statek_y, statek_s, statek_w, strzal_x, strzal_y, strzal_s, strzal_w ) == true ) { play_sample( dzwiek, 255, 127, 3000, 0 ); } if( key[ KEY_LEFT ] ) statek_x = statek_x - 2; if( key[ KEY_RIGHT ] ) statek_x = statek_x + 2; if( key[ KEY_UP ] ) statek_y = statek_y - 2; if( key[ KEY_DOWN ] ) statek_y = statek_y + 2; if( key[ KEY_A ] ) enemy_x = enemy_x - 2; if( key[ KEY_D ] ) enemy_x = enemy_x + 2; if( key[ KEY_W ] ) enemy_y = enemy_y - 2; if( key[ KEY_S ] ) enemy_y = enemy_y + 2; } } } } speed--; } clear_to_color( bufor, makecol( 255, 0, 255 ) ); if( enemy_x < 0 ) { enemy_x = 800; } if( enemy_y < 0 ) { enemy_y = 600; } if( enemy_x > 800 ) { enemy_x = 0; } if( enemy_y > 600 ) { enemy_y = 0; } if( statek_x < 0 ) { statek_x = 800; } if( statek_y < 0 ) { statek_y = 600; } if( statek_x > 800 ) { statek_x = 0; } if( statek_y > 600 ) { statek_y = 0; } if( frame < 40 ) { draw_sprite( bufor, bmp, 0, 0 ); } else { draw_sprite( bufor, bmp, 0, 0 ); } if( frame < 40 ) { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } else { draw_sprite( bufor, enemy, enemy_x, enemy_y ); } if( frame < 40 ) { draw_sprite( bufor, statek, statek_x, statek_y ); } else { draw_sprite( bufor, statek, statek_x, statek_y ); } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( statek ); destroy_bitmap( enemy ); destroy_bitmap( strzal ); stop_sample( dzwiek ); destroy_bitmap( bufor ); destroy_sample( dzwiek ); destroy_bitmap( bufor2 ); destroy_bitmap( bmp ); allegro_exit(); return 0; } END_OF_MAIN();
|