Выше, проблема у меня есть. Я использую 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;
}
Как я уже сказал, это пример кода из онлайн-учебника.
Быстрое исправление — это именно то, что @mythagel упомянул в комментариях.
Как правило, в играх Allegro вам нужно создать таймер и установить его на некоторый фиксированный интервал (например, 60 раз в секунду) и прикрепить его к своей очереди событий. Каждый раз, когда это происходит, вы продвигаете логику вашей игры на один кадр, а затем перерисовываете графику (если больше нечего делать).
Таким образом, вместо обработки ввода непосредственно во время ключевых событий, вы просто отмечаете, что клавиша нажата или нажата. Таким образом, вы можете иметь переменную с именем key_left
который представляет движение влево и установите его в true
в событии keydown и false
в событии keyup.
Тогда в вашем таймере события (ALLEGRO_EVENT_TIMER
), ты можешь проверить if (key_left == true) pos_x -= 10;
Это заставит вашу игру работать с одинаковой скоростью на каждом компьютере, так как вы всегда обрабатываете ввод ровно X раз в секунду.
Существуют более продвинутые способы обработки ввода, которые не включают фиксированную частоту кадров, но это самый простой подход и обычно работает просто отлично.
Других решений пока нет …