Uczę się ALLEGRO 5, znalazłem 2 sposoby obsługi klawiszy, pierwszy z nich działa na zasadzie poczekalni zdarzeń, tam wysyła aktualne zdarzenie i potem coś się dzieje. Jak mniemam powoduje to ze program działa szybciej. Drugi sposób znowu nie wykorzystuje tego. Chciał bym was prosić by ktoś uświadomił mi czym różnią się 2 podane przeze mnie sposoby, i który lepiej używać:
events queue:
// C++ ALLEGRO 5 MADE EASY TUTORIAL 7 - KEYBOARD EVENTS
// CODINGMADEEASY
#include<allegro5\allegro5.h>
#include<allegro5\allegro_native_dialog.h>
#include<allegro5\allegro_primitives.h>
#define ScreenWidth 800
#define ScreenHeight 600
int main()
{
ALLEGRO_DISPLAY *display;
if(!al_init())
al_show_native_message_box(NULL, "Error", NULL, "Could not Initialize Allegro", NULL, NULL);
display = al_create_display(ScreenWidth, ScreenHeight);
if(!display)
al_show_native_message_box(NULL, "Erro", NULL, "Could not create Allegro Display", NULL, NULL);
al_set_window_position(display, 200, 200);
bool done = false;
int x = 10, y = 10, moveSpeed = 5;
al_init_primitives_addon();
al_install_keyboard();
ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue();
al_register_event_source(event_queue, al_get_keyboard_event_source());
while(!done)
{
ALLEGRO_EVENT events;
al_wait_for_event(event_queue, &events);
if(events.type == ALLEGRO_EVENT_KEY_DOWN)
{
switch(events.keyboard.keycode)
{
case ALLEGRO_KEY_DOWN:
y += moveSpeed;
break;
case ALLEGRO_KEY_UP:
y -= moveSpeed;
break;
case ALLEGRO_KEY_RIGHT:
x += moveSpeed;
break;
case ALLEGRO_KEY_LEFT:
x -= moveSpeed;
break;
case ALLEGRO_KEY_ESCAPE:
done = true;
break;
}
}
al_draw_rectangle(x, y, x + 10, y + 10, al_map_rgb(44, 117, 255), 1);
al_flip_display();
al_clear_to_color(al_map_rgb(0, 0, 0));
}
al_destroy_display(display);
al_destroy_event_queue(event_queue);
return 0;
}
Sposób 2:
// C++ ALLEGRO 5 MADE EASY TUTORIAL 9 - KEYBOARD INPUT
// CODINGMADEEASY
#include<allegro5\allegro5.h>
#include<allegro5\allegro_native_dialog.h>
#include<allegro5\allegro_primitives.h>
#define ScreenWidth 800
#define ScreenHeight 600
int main()
{
ALLEGRO_DISPLAY *display;
const float FPS = 60.0;
enum Direction { UP, DOWN, LEFT, RIGHT };
if(!al_init())
al_show_native_message_box(NULL, "Error", NULL, "Could not Initialize Allegro", NULL, NULL);
display = al_create_display(ScreenWidth, ScreenHeight);
if(!display)
al_show_native_message_box(NULL, "Error", NULL, "Could not create Allegro Display", NULL, NULL);
al_set_window_position(display, 200, 200);
bool done = false, draw = true;
int x = 10, y = 10, moveSpeed = 5;
int dir = DOWN;
al_init_primitives_addon();
al_install_keyboard();
ALLEGRO_KEYBOARD_STATE keyState;
ALLEGRO_TIMER *timer = al_create_timer(1.0 / FPS);
ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue();
al_register_event_source(event_queue, al_get_keyboard_event_source());
al_register_event_source(event_queue, al_get_timer_event_source(timer));
al_start_timer(timer);
while(!done)
{
ALLEGRO_EVENT events;
al_wait_for_event(event_queue, &events);
if(events.type == ALLEGRO_EVENT_KEY_UP)
{
switch(events.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
done = true;
}
}
if(events.type == ALLEGRO_EVENT_TIMER)
{
al_get_keyboard_state(&keyState);
if(al_key_down(&keyState, ALLEGRO_KEY_DOWN))
y += moveSpeed;
else if(al_key_down(&keyState, ALLEGRO_KEY_UP))
y -= moveSpeed;
else if(al_key_down(&keyState, ALLEGRO_KEY_RIGHT))
x += moveSpeed;
else if(al_key_down(&keyState, ALLEGRO_KEY_LEFT))
x -= moveSpeed;
draw = true;
}
if(draw)
{
draw = false;
al_draw_rectangle(x, y, x + 10, y + 10, al_map_rgb(44, 117, 255), 1);
al_flip_display();
al_clear_to_color(al_map_rgb(0, 0, 0));
}
}
al_destroy_display(display);
al_destroy_timer(timer);
al_destroy_event_queue(event_queue);
return 0;
}