Название гласит все. Все работает правильно (я могу использовать кнопку esc или нажать X для выхода из окна), в то время как окно находится в фокусе, но как только я скрою его или открою другое окно, когда снова включу приложение Allegro в фокус. События больше не работают. Он больше не реагирует на Escape или X. Любые решения?Allegro 5 не реагирует на события клавиатуры или закрытие окна после выхода из фокуса
Код:
#include <allegro/allegro5/allegro.h>
#include <allegro/allegro5/allegro_native_dialog.h>
#include <allegro/allegro5/allegro_font.h>
#include <allegro/allegro5/allegro_ttf.h>
#include <allegro/allegro5/allegro_image.h>
#include <allegro/allegro5/allegro_primitives.h>
#include <iostream>
#define SCREENWIDTH 800
#define SCREENHEIGHT 600
using namespace std;
bool running = true;
int main(int argc, char** argv)
{
al_init();
al_init_font_addon();
al_init_ttf_addon();
al_init_primitives_addon();
al_install_keyboard();
ALLEGRO_DISPLAY* display = al_create_display(SCREENWIDTH, SCREENHEIGHT);
ALLEGRO_FONT* font = al_load_font("soviet.ttf", 36, 0);
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_display_event_source(display));
if(!al_init())
{
al_show_native_message_box(NULL, NULL, NULL, "Could not initialize Allegro 5", NULL, ALLEGRO_MESSAGEBOX_YES_NO);
return -1;
}
if(!display)
{
al_show_native_message_box(display, "ERROR", "Display settings", "Display window was not created sucessfully", NULL, ALLEGRO_MESSAGEBOX_YES_NO);
return -1;
}
int x1 = 10;
int y1 = 10;
int x2 = 30;
int y2 = 30;
while(running)
{
///OnUpdate
ALLEGRO_EVENT events;
al_peek_next_event(event_queue, &events);
if(events.type == ALLEGRO_EVENT_KEY_DOWN)
{
if(events.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
{
running = false;
break;
}
}
if(events.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
{
running = false;
break;
}
x1++;
y1++;
x2++;
y2++;
///OnRender
al_draw_text(font, al_map_rgb(255, 0, 255), 200, 200, 0, "Test");
al_draw_filled_rectangle(x1, y1, x2, y2, al_map_rgb(255, 0, 0));
al_flip_display();
al_clear_to_color(al_map_rgb(0, 0, 0));
al_rest(0.05);
}
///DEALLOCATE MEMORY
al_destroy_font(font);
al_destroy_display(display);
return 0;
}
Мой код действительно работает. Это события, которые перестают работать после того, как окно приложения выходит из фокуса и обратно. Если я установил его с помощью al_wait_for_event(), мой игровой цикл будет работать только тогда, когда я нажимаю и удерживаю клавиши в ловушке событий. Итак, я действительно не нахожу ваш ответ полезным, если только я не понял его из-за своей нужности. xD –
@ MatejŠtajduhar. Это связано с тем, что вы также должны добавить таймер в очередь событий. В противном случае вы также можете использовать 'al_get_next_event()', но обрабатывать событие только, если оно возвращает 'true'. 'peek' - абсолютно неправильная функция для использования здесь. – Matthew
Вы были правы, извините! Спасибо за помощь! знак равно –