allegro — Программа вывода на C ++ полностью белая без видимой причины

Выше, проблема у меня есть. Я использую Visual Studio 2010 в C ++ с библиотекой Allegro для разработки игр. У меня проблема с тем, что моя тестовая программа всегда полностью белая, пока в некоторых случаях я не нажимаю кнопку. Я не очень понимаю, как это исправить, и что не так. Я точно знаю, что это не связано с используемым кодом, так как это никогда не происходило с некоторым примером кода с веб-сайта; теперь, похоже, все время происходит с этим проектом. Если бы кто-то мог указать мне на возможное исправление ошибки, это было бы очень ценно.

Ниже приведен код:

#include <allegro5\allegro.h>
#include <allegro5\allegro_primitives.h>                //Our primitive header file

int main(void)
{
int width = 640;
int height = 480;

bool done = false;
int pos_x = width / 2;
int pos_y = height / 2;

ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;

if(!al_init())                                      //initialize Allegro
return -1;

display = al_create_display(width, height);         //create our display object

if(!display)                                        //test display object
return -1;

al_init_primitives_addon();
al_install_keyboard();

event_queue = al_create_event_queue();

al_register_event_source(event_queue, al_get_keyboard_event_source());

while(!done)
{
ALLEGRO_EVENT ev;
al_wait_for_event(event_queue, &ev);

if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
{
switch(ev.keyboard.keycode)
{
case ALLEGRO_KEY_UP:
pos_y -= 10;
break;
case ALLEGRO_KEY_DOWN:
pos_y += 10;
break;
case ALLEGRO_KEY_RIGHT:
pos_x += 10;
break;
case ALLEGRO_KEY_LEFT:
pos_x -= 10;
break;
}
}
else if(ev.type == ALLEGRO_EVENT_KEY_UP)
{
if(ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
done = true;
}

al_draw_filled_rectangle(pos_x, pos_y, pos_x + 30, pos_y + 30, al_map_rgb(255,0,255));
al_flip_display();
al_clear_to_color(al_map_rgb(0,0,0));
}

al_destroy_event_queue(event_queue);
al_destroy_display(display);                        //destroy our display object

return 0;
}

Как я уже сказал, это пример кода из онлайн-учебника.

0

Решение

Быстрое исправление — это именно то, что @mythagel упомянул в комментариях.

Как правило, в играх Allegro вам нужно создать таймер и установить его на некоторый фиксированный интервал (например, 60 раз в секунду) и прикрепить его к своей очереди событий. Каждый раз, когда это происходит, вы продвигаете логику вашей игры на один кадр, а затем перерисовываете графику (если больше нечего делать).

Таким образом, вместо обработки ввода непосредственно во время ключевых событий, вы просто отмечаете, что клавиша нажата или нажата. Таким образом, вы можете иметь переменную с именем key_left который представляет движение влево и установите его в true в событии keydown и false в событии keyup.

Тогда в вашем таймере события (ALLEGRO_EVENT_TIMER), ты можешь проверить if (key_left == true) pos_x -= 10; Это заставит вашу игру работать с одинаковой скоростью на каждом компьютере, так как вы всегда обрабатываете ввод ровно X раз в секунду.

Существуют более продвинутые способы обработки ввода, которые не включают фиксированную частоту кадров, но это самый простой подход и обычно работает просто отлично.

0

Другие решения

Других решений пока нет …