2013-03-19 3 views
2

Название гласит все. Все работает правильно (я могу использовать кнопку 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; 
} 

ответ

0

al_peek_next_event() не удаляет событие и не блокирует. Таким образом, ваш код будет работать неправильно по обоим причинам.

Если вы замените его на al_wait_for_event() (который блокирует и удаляет событие), я думаю, что ваш код будет делать то, что вы ожидаете от него.

+0

Мой код действительно работает. Это события, которые перестают работать после того, как окно приложения выходит из фокуса и обратно. Если я установил его с помощью al_wait_for_event(), мой игровой цикл будет работать только тогда, когда я нажимаю и удерживаю клавиши в ловушке событий. Итак, я действительно не нахожу ваш ответ полезным, если только я не понял его из-за своей нужности. xD –

+0

@ MatejŠtajduhar. Это связано с тем, что вы также должны добавить таймер в очередь событий. В противном случае вы также можете использовать 'al_get_next_event()', но обрабатывать событие только, если оно возвращает 'true'. 'peek' - абсолютно неправильная функция для использования здесь. – Matthew

+0

Вы были правы, извините! Спасибо за помощь! знак равно –

 Смежные вопросы

  • Нет связанных вопросов^_^