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

[Allegro 5] SpriteSheet animation

Ostatnio zmodyfikowano 2014-06-28 17:09
Autor Wiadomość
Haker123
Temat założony przez niniejszego użytkownika
[Allegro 5] SpriteSheet animation
» 2014-06-28 15:13:07
Witam.

Mam problem z animacja obrazka, jest ona zaszybka i nie wiem jak ja zwolnic.
Myslalem nad dodaniem kolejnej kolejki zdarzen ale program strasznie zwolnil oraz mam opuznienia na myszce.

Kod wyglada tak :
C/C++
#include <allegro5/allegro5.h>
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_image.h>

#define FPS 60
#define ScreenWidth 800
#define ScreenHeight 600

int main()
{
    if( !al_init() )
    {
        al_show_native_message_box( NULL, "ALLEGRO ERROR", "ERROR", "Allegro don't work", NULL, ALLEGRO_MESSAGEBOX_ERROR );
        return - 1;
    }
   
    ALLEGRO_DISPLAY * display = al_create_display( ScreenWidth, ScreenHeight );
   
    if( !display )
    {
        al_show_native_message_box( display, "DISPLAY ERROR", "ERROR", "Display is not create", NULL, ALLEGRO_MESSAGEBOX_ERROR );
        return - 1;
    }
   
    //POZYCJA OKNA TUZ PO URUCHOMIENIU
    al_set_window_position( display, 100, 100 );
   
    enum { DOWN, LEFT, RIGHT, UP }; //ZMIENNE POMOCNE PRZY WYPISANIU ODPOWIEDNIEGO OBRAZKA
    //POZYCJA ZDJECIA Z KLAWIATURY
    float x = 0, y = 0, moveSpeed = 2;
    //POZYCJA ZDJECIA Z MYSZKI
    int x1 = 100, y1 = 200;
   
    //SPRAWDZAMY CZY SIE RUSZYLISMY
    bool active = false;
    bool done = false, draw = false;
   
    int dir = DOWN;
    //ZMIENNE DO PORUSZANIA SIE PO ZDJECIU (ODPOWIEDNIE POZYCJA W ODPOWIEDNIM CZASIE)
    int sourceX = 32, sourceY = 0;
   
    //DODAJEMY OBSLUGE ZDJEC
    al_init_image_addon();
    //INSTALUJEMY KLAWIATURE I MYSZKE
    al_install_keyboard();
    al_install_mouse();
   
    ALLEGRO_KEYBOARD_STATE keyState;
    //CO JAKI CZAS MA BYC WYSYLANY EVENT TIMER (ODSWIEZANIE CALEGO EKRANU)
    ALLEGRO_TIMER * timer = al_create_timer( 1.0 / FPS );
   
    //TIMER POTRZEBNY DO WOLNEGO WYPISYWANIA ANIMACJI
    //ALLEGRO_TIMER *timer2 = al_create_timer(1.0 / 2) ;
   
    //TWORZYMY BITMAPE I LADUJEMY DO NIEJ OBRAZEK
    ALLEGRO_BITMAP * player = al_load_bitmap( "1.png" );
    //ZDJECIE PRZYPISANE DO MYSZKI
    ALLEGRO_BITMAP * player2 = al_load_bitmap( "2.png" );
    //TWORZYMY KOLEJKE ZDARZEN
    ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue();
   
    //TWORZYMY KOLEJKE ZDARZEN DLA ANIMACJI
    //ALLEGRO_EVENT_QUEUE *event_queue1 = al_create_event_queue() ;
   
    //PRZYPISUJEMY EVENTY DO KOLEJKI
    al_register_event_source( event_queue, al_get_mouse_event_source() );
    al_register_event_source( event_queue, al_get_keyboard_event_source() );
    al_register_event_source( event_queue, al_get_display_event_source( display ) );
    al_register_event_source( event_queue, al_get_timer_event_source( timer ) );
   
    //al_register_event_source(event_queue1 , al_get_timer_event_source(timer2)) ;
   
    //CHOWAMY KURSOR NA EKRANIE
    al_hide_mouse_cursor( display );
   
    //ALLEGRO_TIMEOUT timeout ;
    //al_init_timeout(&timeout , 0.06) ;
   
    al_start_timer( timer );
   
    //al_start_timer(timer2) ;
   
    while( !done )
    {
        //TWORZYMY EVENT I POBIERAMY DO NIEGO EVENT Z KOLEJKI
        ALLEGRO_EVENT events /*, events1*/;
        al_wait_for_event( event_queue, & events );
       
        //al_wait_for_event_until(event_queue1 , &events1 , &timeout) ;
       
        al_get_keyboard_state( & keyState );
       
        //SPRAWDZAMY CZY ZDARZENIE POCODZI OD KLAWIATURY
        if( events.type == ALLEGRO_EVENT_KEY_UP )
        if( events.keyboard.keycode == ALLEGRO_KEY_ESCAPE )
             done = true;
        //SPRAWDZAMY CZ EVENT POCHODZI OD OKNA
        if( events.type == ALLEGRO_EVENT_DISPLAY_CLOSE )
             done = true;
       
        //SPRAWDZAMY CZY EVENT POCHODZI OD RUCHU MYSZKI
        if( events.type == ALLEGRO_EVENT_MOUSE_AXES )
        {
            x1 = events.mouse.x;
            y1 = events.mouse.y;
            //if((x1 + 20) > ScreenWidth)
            // x1 = ScreenWidth - 20 ;
            //if((y1 + 20) > ScreenHeight)
            // y1 = ScreenHeight - 20 ;
           
        }
       
        //SPRAWDZAMY EVENT CZASU
        if( events.type = ALLEGRO_EVENT_TIMER )
        {
            if( al_key_down( & keyState, ALLEGRO_KEY_DOWN ) )
            {
                //WLACZAMY "RUCH"
                active = true;
                y += moveSpeed;
                dir = DOWN;
                if(( y + 32 ) > ScreenHeight )
                     y = ScreenHeight - 32;
               
            }
            if( al_key_down( & keyState, ALLEGRO_KEY_UP ) )
            {
                //WLACZAMY "RUCH"
                active = true;
                y -= moveSpeed;
                dir = UP;
                if( y < 0 )
                     y = 0;
               
            }
            if( al_key_down( & keyState, ALLEGRO_KEY_LEFT ) )
            {
                //WLACZAMY "RUCH"
                active = true;
                x -= moveSpeed;
                dir = LEFT;
                if( x < 0 )
                     x = 0;
               
            }
            if( al_key_down( & keyState, ALLEGRO_KEY_RIGHT ) )
            {
                //WLACZAMY "RUCH"
                active = true;
                x += moveSpeed;
                dir = RIGHT;
                if(( x + 32 ) > ScreenWidth )
                     x = ScreenWidth - 32;
               
            }
           
            //JESLI BYL RUCH TO PRZEJEZDZAMY PO OSI X NA ZDJECIU (SZEROKOSC) / 3 zdjecia
            if( active )
            //if(events1.type == ALLEGRO_EVENT_TIMER)
                 sourceX += al_get_bitmap_width( player ) / 3;
            else
                 sourceX = 32;
            //JESI PRZELECIELISMY PO CALEJ OSI X TO WRACAMY NA JEJ POCZATEK
            if( sourceX >= al_get_bitmap_width( player ) )
                 sourceX = 0;
           
            draw = true;
            //PRZECHODZIMY PO OSI Y
            sourceY = dir;
           
            active = false;
        }
       
        if( draw )
        {
            draw = false;
            //RYSUJEMY ZDJECIE CALEGO
            al_draw_bitmap( player2, x1, y1, NULL );
            //RYSUJEMY KAWALEK ZDJECIA
            al_draw_bitmap_region( player, sourceX, sourceY * al_get_bitmap_height( player ) / 4, 32, 32,
            x, y, NULL );
            al_flip_display();
            al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
        }
    }
   
    al_destroy_display( display );
    al_destroy_bitmap( player );
    al_destroy_bitmap( player2 );
    al_destroy_timer( timer );
    al_destroy_event_queue( event_queue );
   
    return 0;
}
P-112880
pekfos
» 2014-06-28 15:29:30
Zrób prosty timer na jednej zmiennej int, by zmniejszyć częstotliwość aktualizacji animacji.
P-112882
Haker123
Temat założony przez niniejszego użytkownika
» 2014-06-28 16:20:28
Mam 2 timery
C/C++
//CO JAKI CZAS MA BYC WYSYLANY EVENT TIMER (ODSWIEZANIE CALEGO EKRANU)
ALLEGRO_TIMER * timer = al_create_timer( 1.0 / FPS );

//TIMER POTRZEBNY DO WOLNEGO WYPISYWANIA ANIMACJI
ALLEGRO_TIMER * timer2 = al_create_timer( 0.5 );

I niestety dalej mam wolny program.

Chyba wiem gdzie jest problem.
W petli while musze dac obsluge 2 roznych eventow (jeden do odswiezania ekranu , drugi do rysowania animacji), ale jak zrobic tak zeby obydwa naraz otrzymywaly eventy z kolejki?

C/C++
ALLEGRO_EVENT events, events1;
//ODSWIEZANIE EKRANU
al_wait_for_event( event_queue, & events );

//ANIMACJA
al_wait_for_event( event_queue1, & events1 );

1 event czeka az cos dostanie ale zaraz po nim jest 2 event ktory tez czeka.

Jesli dobrze mysle to jak to mam rozwiazac??
A jesli zle to juz nie mam pomyslu ...
P-112886
pekfos
» 2014-06-28 16:33:26
Wystarczy jedna kolejka zdarzeń. Używanie więcej niż jednej naraz to rozwiązanie bez najmniejszego sensu. Masz po prostu 2 timery, które generują zdarzenia ALLEGRO_EVENT_TIMER - po event.timer.source rozpoznajesz, który timer go wywołał.

C/C++
if( events.type = ALLEGRO_EVENT_TIMER )
I popraw błędy tego typu..
P-112887
Haker123
Temat założony przez niniejszego użytkownika
» 2014-06-28 17:09:07
Dzieki.
"event.timer.source" pomoglo i program dziala jak trzeba ;]

P-112891
« 1 »
  Strona 1 z 1