agrere Temat założony przez niniejszego użytkownika |
ALLEGRO Dokładne odbijanie piłki w platformówce » 2013-03-01 22:51:33 Witam, otóż mam problem, stworzyłem platformówkę z grawitacją tzn. przy odbiciu ustawiam wartosc kierunku.Y na - 20 i z każdym obrotem pętli do jego wartości dodaję 1. Problem polega na tym, że pilka wbija się w platformy. Wiem dlaczego tak się dzieje, ale nie wiem jak to naprawić. Z góry dziękuję za pomoc Oto fragment kodu: while(...) { ... draw_sprite( bufor, pilka, x, y ); ... y += kierunek.Y; kierunek.Y += 1; if( x + 20 > lewybok[ i ] && x + 10 < lewybok[ i ] + 100 && y + 30 >= yPlatformy[ i ] && y <= yPlatformy[ i ] + 20 && kierunekY > 0 ) { kierunek.Y = - 20; ... }
|
|
ziajek444 |
» 2013-03-01 23:22:25 if( x + 20 > lewybok[ i ] && x + 10 < lewybok[ i ] + 100 && y + 30 >= yPlatformy[ i ] && y <= yPlatformy[ i ] + 20 && kierunekY > 0 ) piłka nie może spełnić wszystkich tych warunków na raz, więc nie zachodzi żadna interakcja. spróbuj raczej if(x==100) odbicie piłki. //zakładam tu że góra platformy jest na 100 pikselach od góry. I to samo z resztą ścianek. aktualizacja 2013-03-02 02:41 Może ten kod ci pomoże (napisałem specjalnie dla ciebie przed snem) :) #include <allegro.h>
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); BITMAP * tlo = create_bitmap( 800, 600 ); BITMAP * platforma = create_bitmap( 600, 400 ); clear_to_color( tlo, makecol( 255, 255, 255 ) ); clear_to_color( platforma, makecol( 255, 0, 0 ) ); int x = 200, y = 200; bool odbicie_x = false; bool odbicie_y = false; int srednica_pilki = 40; int miejsce_x = 100; int miejsce_y = 100; while( !key[ KEY_ESC ] ) { clear_to_color( platforma, makecol( 255, 0, 0 ) ); circlefill( platforma, x, y, srednica_pilki, makecol( 64, 64, 64 ) ); blit( platforma, tlo, 0, 0, miejsce_x, miejsce_y, platforma->w, platforma->h ); blit( tlo, screen, 0, 0, 0, 0, tlo->w, tlo->h ); if( x == platforma->w - srednica_pilki ) odbicie_x = true; if( y == platforma->h - srednica_pilki ) odbicie_y = true; if( x == srednica_pilki ) odbicie_x = false; if( y == srednica_pilki ) odbicie_y = false; if( odbicie_x == true ) x--; if( odbicie_y == true ) y--; if( odbicie_x == false ) x++; if( odbicie_y == false ) y++; rest( 10 ); } readkey(); destroy_bitmap( platforma ); destroy_bitmap( tlo ); return 0; } END_OF_MAIN();
|
|
agrere Temat założony przez niniejszego użytkownika |
» 2013-03-02 06:44:11 dzieki za kod ale mi zależało na grawitacji, i kiedy ustawiam wartosc kierunekY na wartość 20, to pilka mi skacze co 20pik (y+=kierunekY), potem co 19 itp. i są raczej małe szanse, że trafi dokłanie w punkt 100 czyi gory platformy |
|
ziajek444 |
» 2013-03-02 11:14:40 No to cię nie zrozumiałem, też nad tym pracowałem, zaraz ci podeśle kodzik: #include <allegro.h>
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 700, 0, 0 ); BITMAP * buffer = create_bitmap( 640, 700 ); clear_to_color( buffer, 1 ); int x = 100; int y = 400; int srednica_pilki = 30; bool rzut = false; int moc = 0; bool spadek = false; while( !key[ KEY_ESC ] ) { if( key[ KEY_ENTER ] ) { rzut = true; moc = 0; } if( rzut == true ) { x += 10; y -= 11; moc++; } if( moc == 20 ) { rzut = false; spadek = true; } if( spadek == true ) { x += 10; y += 11; moc--; } if( moc == 0 ) { y = 400; x = 100; spadek = false; } clear_to_color( buffer, 1 ); rest( 20 ); circlefill( buffer, x, y, srednica_pilki, makecol( 64, 64, 64 ) ); blit( buffer, screen, 0, 0, 0, 0, 640, 700 ); } readkey(); destroy_bitmap( buffer ); return 0; } END_OF_MAIN(); SPECIALNIE dla ciebie przerobiłem go z Winbgim na allegro 4 |
|
agrere Temat założony przez niniejszego użytkownika |
» 2013-03-02 13:05:50 dzieki
|
|
« 1 » |