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

[Allegro 5] Obsluga myszki i klawiatury. Jak to polaczyc.

Ostatnio zmodyfikowano 2014-06-28 16:51
Autor Wiadomość
Haker123
Temat założony przez niniejszego użytkownika
[Allegro 5] Obsluga myszki i klawiatury. Jak to polaczyc.
» 2014-06-28 15:19:49
Witam.

Mam problem ze synchronizowaniem sygnalu z klawiatury i myszki.
Jak ruszam postacia za pomoca klawiatury to ekran odswieza sie z predkoscia 60 klatek na sekunde.Kiedy rusze myszka to animacja postaci poruszanej za pomoca klawiatury przyspiesza tak jakby odswiezanie bylo wieksze niz je ustawilem. Kiedy zatrzymam myszke to animacja postaci (z klawiatury) znowu jest taka jak ma byc. Nie wiem gdzie jest blad , dopiero zaczynam nauke z Allegro.

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-112881
pekfos
» 2014-06-28 15:31:14
C/C++
if( events.type = ALLEGRO_EVENT_TIMER )
P-112883
Haker123
Temat założony przez niniejszego użytkownika
» 2014-06-28 16:10:19
Niestety nie rozumiem.

Mam sprawdzanie czy zdarzenie pochodzi od czasu i w tym poruszam postacia za pomoca klawiatury.

Mam w tym wpisac obsluge eventu od myszki?
P-112884
pekfos
» 2014-06-28 16:38:59
Niestety nie rozumiem.
Tym gorzej dla ciebie, bo to błąd tak jasny i widoczny, że nie powinien być potrzebny żaden komentarz.
P-112888
Haker123
Temat założony przez niniejszego użytkownika
» 2014-06-28 16:51:09
Teraz dopiero to widze ;]

Nie widzialem tego wczesniej bo myslalem o czyms innym, ale to i tak mnie nie usprawiedliwia ;]

Dzieki za pomoc teraz dziala wszystko jak trzeba.
P-112890
« 1 »
  Strona 1 z 1