Ethril Temat założony przez niniejszego użytkownika |
[C++, Allegro] Problem ze skokiem » 2014-04-27 17:39:04 Witam o to mój kod #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( 16 ); set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) ); BITMAP * bufor = NULL; BITMAP * ludek = NULL; bufor = create_bitmap( 640, 480 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } ludek = load_bmp( "ludek.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } int x = 1; int y = 1; const int gravity = 1; int groundheight = 400; int ludek_x = 0; int ludek_y = 400; while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ) ludek_x--; else if( key[ KEY_RIGHT ] ) ludek_x++; if( key[ KEY_UP ] && ludek_y >= groundheight ) ludek_y -= 100; else { ludek_y += gravity; } if( ludek_y >= groundheight ) ludek_y = groundheight; speed--; clear_to_color( bufor, makecol( 150, 150, 150 ) ); masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); rest( 1 ); } remove_int( increment_speed ); destroy_bitmap( ludek ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
Problem jest w tym, że moment spadania jest strasznie szybki i próbowałem różnych metod, żeby zwolnić to, ale nic. |
|
pekfos |
» 2014-04-27 17:41:23 Masz kod timera, ale go nie używasz. |
|
Ethril Temat założony przez niniejszego użytkownika |
» 2014-04-27 20:42:45 Dodałem ten kod timera i teraz odwrotnie jest, że szybko leci do góry, ale prawidłowo leci do dołu int x = 1; int y = 1; const int gravity = 1; int groundheight = 400; int ludek_x = 0; int ludek_y = 400;
while( !key[ KEY_ESC ] ) while( speed > 0 ) { { if( key[ KEY_LEFT ] ) ludek_x--; else if( key[ KEY_RIGHT ] ) ludek_x++; if( key[ KEY_UP ] && ludek_y >= groundheight ) ludek_y -= 100; else { ludek_y += gravity; } if( ludek_y >= groundheight ) ludek_y = groundheight; speed--; }
|
|
pekfos |
» 2014-04-27 21:15:39 A masz jakiekolwiek spowalnianie lotu do góry? |
|
Ethril Temat założony przez niniejszego użytkownika |
» 2014-04-27 21:17:54 Nie mam, ale na jakiej zasadzie to ma działać ? |
|
pekfos |
» 2014-04-27 21:19:54 Zapewne jako tako zgodnie z fizyką: if( skok ) predkosc = - 200;
y += predkosc * czas;
predkosc += grawitacja * czas; |
|
Ethril Temat założony przez niniejszego użytkownika |
» 2014-04-27 21:35:08 Ta zmienna "czas" co ma przedstawiać ? Pytam tak, bo dopiero zaczynam z allegro. |
|
pekfos |
» 2014-04-28 09:53:08 To nie wynika ani z allegro, ani nawet z programowania ogólnie, tylko z podstawowej fizyki. No czas, no.. Jak coś spada sekundę, to podstawiasz sekundę. Jak taką aktualizację wykonujesz co klatkę, to podstawiasz czas od ostatniej klatki, by jedna sekunda gry złożyła się na jedną sekundę ruchu. Jak już masz timer, który jako tako przybliża ten czas do jednej stałej wartości, to podstawiasz, w tym przypadku, jakieś 1./80 |
|
« 1 » |