BlackSmith Temat założony przez niniejszego użytkownika |
[C++, Allegro] Zmiana działania programu po odłączeniu laptopa od zasilania » 2014-03-13 21:20:18 Witam Piszę już trochę w C++ i postanowiłem nauczyć się Allegro. Jak na razie korzystałem z tego tutoriala: http://cpp0x.pl/kursy/Kurs-Allegro-4-x-C++/21. Po przeczytaniu całego postanowiłem dodać bardzo prymitywną fizykę do przykładu z tutoriala, czyli grawitację i możliwość skakania (to moje pierwsze próby, więc pewnie da się to zrobić łatwiej ;)). I wszystko działało jak powinno dopóki nie odłączyłem laptopa od zasilania. Okazało się, że wtedy postać skacze mniej-więcej dwa razy niżej niż przy podłączonym zasilaniu. Z tego co zrozumiałem z kursu, przed takimi sytuacjami miały uchronić timery, których użyłem jak było opisane. W czym więc leży problem? Zamieszczam mój kod, chociaż wydaje mi się, że nie ma w nim błędów, a raczej czegoś brakuje... Z góry dzięki za pomoc! #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() { const int x = 640; const int y = 480; const int G = 10; const int mtopx = 200; const int v0 = 500; allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, x, y, 0, 0 ); clear_to_color( screen, makecol( 128, 128, 128 ) ); install_timer(); const int szybkosc = 100; install_int_ex( increment_speed, BPS_TO_TIMER( szybkosc ) ); BITMAP * bufor = NULL; bufor = create_bitmap( x, y ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie moge utworzyc bufora !" ); allegro_exit(); return 0; } BITMAP * ludek1 = NULL; BITMAP * ludek2 = NULL; BITMAP * ludek3 = NULL; BITMAP * ludek4 = NULL; ludek1 = load_bmp( "ludek1.bmp", default_palette ); ludek2 = load_bmp( "ludek2.bmp", default_palette ); ludek3 = load_bmp( "ludek3.bmp", default_palette ); ludek4 = load_bmp( "ludek4.bmp", default_palette ); double ludek_x = 100, ludek_y = 100; int frame = 0; int predkosc = 300; long long czas = 0; long long czas_p = 0; double v_x = 0; double v_y = 0; int inny_ruch = 0; bool stoi = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] && ludek_x > 0 ) ludek_x -= 4; if( key[ KEY_RIGHT ] && ludek_x < x - ludek1->w ) ludek_x += 4; if( key[ KEY_UP ] && ludek_y > 0 && stoi ) { inny_ruch = 1; czas_p = czas - 1; stoi = 0; } if( key[ KEY_DOWN ] && ludek_y < y - ludek1->h ) ludek_y += 4; speed--; czas++; frame++; if( frame > 100 ) frame = 0; } if( inny_ruch == 1 ) { v_y = v0 -( G *(( double )( czas - czas_p ) / szybkosc ) * mtopx ); ludek_y -= v_y / szybkosc; if( v_y <= 0 ) inny_ruch = 0; } if( v_y == 0 && ludek_y < y - ludek1->h ) { czas_p = czas - 1; } if( !inny_ruch && ludek_y < y - ludek1->h ) { v_y = G *(( double )( czas - czas_p ) / szybkosc ) * mtopx; ludek_y += v_y / szybkosc; } else if( !inny_ruch ) { v_y = 0; stoi = 1; } clear_to_color( bufor, makecol( 128, 128, 128 ) ); int lud_x = ludek_x; int lud_y = ludek_y; if( lud_x < 0 ) lud_x = 0; if( lud_x > x - ludek1->w ) lud_x = x - ludek1->w; if( lud_y < 0 ) lud_y = 0; if( lud_y > y - ludek1->h ) { lud_y = y - ludek1->h; stoi = 1; } if( frame < 20 ) masked_blit( ludek1, bufor, 0, 0, lud_x, lud_y, ludek1->w, ludek1->h ); else if( frame < 40 ) masked_blit( ludek2, bufor, 0, 0, lud_x, lud_y, ludek2->w, ludek2->h ); else if( frame < 60 ) masked_blit( ludek3, bufor, 0, 0, lud_x, lud_y, ludek3->w, ludek3->h ); else masked_blit( ludek4, bufor, 0, 0, lud_x, lud_y, ludek4->w, ludek4->h ); blit( bufor, screen, 0, 0, 0, 0, 1366, 768 ); } remove_int( increment_speed ); destroy_bitmap( ludek1 ); destroy_bitmap( ludek2 ); destroy_bitmap( ludek3 ); destroy_bitmap( ludek4 ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|