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 : #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; } al_set_window_position( display, 100, 100 ); enum { DOWN, LEFT, RIGHT, UP }; float x = 0, y = 0, moveSpeed = 2; int x1 = 100, y1 = 200; bool active = false; bool done = false, draw = false; int dir = DOWN; int sourceX = 32, sourceY = 0; al_init_image_addon(); al_install_keyboard(); al_install_mouse(); ALLEGRO_KEYBOARD_STATE keyState; ALLEGRO_TIMER * timer = al_create_timer( 1.0 / FPS ); ALLEGRO_BITMAP * player = al_load_bitmap( "1.png" ); ALLEGRO_BITMAP * player2 = al_load_bitmap( "2.png" ); ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue(); 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_hide_mouse_cursor( display ); al_start_timer( timer ); while( !done ) { ALLEGRO_EVENT events ; al_wait_for_event( event_queue, & events ); al_get_keyboard_state( & keyState ); if( events.type == ALLEGRO_EVENT_KEY_UP ) if( events.keyboard.keycode == ALLEGRO_KEY_ESCAPE ) done = true; if( events.type == ALLEGRO_EVENT_DISPLAY_CLOSE ) done = true; if( events.type == ALLEGRO_EVENT_MOUSE_AXES ) { x1 = events.mouse.x; y1 = events.mouse.y; } if( events.type = ALLEGRO_EVENT_TIMER ) { if( al_key_down( & keyState, ALLEGRO_KEY_DOWN ) ) { active = true; y += moveSpeed; dir = DOWN; if(( y + 32 ) > ScreenHeight ) y = ScreenHeight - 32; } if( al_key_down( & keyState, ALLEGRO_KEY_UP ) ) { active = true; y -= moveSpeed; dir = UP; if( y < 0 ) y = 0; } if( al_key_down( & keyState, ALLEGRO_KEY_LEFT ) ) { active = true; x -= moveSpeed; dir = LEFT; if( x < 0 ) x = 0; } if( al_key_down( & keyState, ALLEGRO_KEY_RIGHT ) ) { active = true; x += moveSpeed; dir = RIGHT; if(( x + 32 ) > ScreenWidth ) x = ScreenWidth - 32; } if( active ) sourceX += al_get_bitmap_width( player ) / 3; else sourceX = 32; if( sourceX >= al_get_bitmap_width( player ) ) sourceX = 0; draw = true; sourceY = dir; active = false; } if( draw ) { draw = false; al_draw_bitmap( player2, x1, y1, NULL ); 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; }
|
|
pekfos |
» 2014-06-28 15:29:30 Zrób prosty timer na jednej zmiennej int, by zmniejszyć częstotliwość aktualizacji animacji. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2014-06-28 16:20:28 Mam 2 timery ALLEGRO_TIMER * timer = al_create_timer( 1.0 / FPS );
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? ALLEGRO_EVENT events, events1;
al_wait_for_event( event_queue, & events );
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 ... |
|
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ł. if( events.type = ALLEGRO_EVENT_TIMER )
|
I popraw błędy tego typu.. |
|
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 ;]
|
|
« 1 » |