Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, Allegro] Zmiana działania programu po odłączeniu laptopa od zasilania

Ostatnio zmodyfikowano 2014-03-13 23:00
Autor Wiadomość
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!
C/C++
#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; //1366;
    const int y = 480; //768;
    const int G = 10;
    const int mtopx = 200; //metr to tyle px
    const int v0 = 500; //predkosc lotu w gore bezposrednio po podskoku
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, x, y, 0, 0 ); //640, 480
    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; //piksele na sekunde
    long long czas = 0;
    long long czas_p = 0;
    double v_x = 0;
    double v_y = 0;
    int inny_ruch = 0; //0 - spada lub stoi na ziemi; 1 - skok w gore
    bool stoi = 0; //0 - jest w powietrzu; 1 - stoi na ziemi
    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();
P-106318
SeaMonster131
» 2014-03-13 22:33:28
Może to dlatego, że robisz update całej fizyki poza pętlą
while( speed > 0 )
?
P-106328
BlackSmith
Temat założony przez niniejszego użytkownika
» 2014-03-13 23:00:31
No jasne, dzięki. Nawet wydawało mi się, że to sprawdziłem ;)
P-106333
« 1 »
  Strona 1 z 1