以上是我遇到的问题。我使用C ++中的Visual Studio 2010和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 :(得分:0)
快速修复正是@mythagel在评论中提到的。
通常使用Allegro游戏,您需要创建一个计时器并让它以固定间隔(例如,每秒60次)打勾并将其附加到您的事件队列。每当它打勾时,你将游戏的逻辑推进一帧,然后重绘图形(如果没有别的事情可做)。
因此,不是在关键事件期间直接处理输入,而只是标记键已关闭或关闭。因此,您可能有一个名为key_left
的变量,表示向左移动并在keydown事件中将其设置为true
,在keyup事件中将其设置为false
。
然后在你的计时器事件(ALLEGRO_EVENT_TIMER
)中,你可以检查if (key_left == true) pos_x -= 10;
这将导致你的游戏在每台计算机上以相同的速度运行,因为你总是每秒处理输入X次。
有更多高级处理输入的方法,不涉及固定的帧速率,但这是最简单的方法,通常工作得很好。