Allegro 5在特定间隔执行事件

4
我正在使用Allegro 5制作我的第一个游戏,这是一款贪吃蛇游戏。为了让贪吃蛇游戏移动,我想使用一个平方网格,使得它可以在规律的时间间隔内移动。
如何使用定时器来在一定时间内触发事件呢?
比如,我希望我的贪吃蛇每秒钟朝设定的方向移动一次,我知道如何控制它,但不知道如何创建一个能够在一定时间间隔内触发的事件。我正在使用Codeblocks IDE和Windows XP SP3操作系统。

2
为什么这个回答会被踩?在提问之前,我已经查看了相关文档,并尝试编写代码并可以提供作为证明的代码。仅仅因为一个初学者问了一个在你看来很愚蠢的问题,并不意味着他很愚蠢,这只是意味着他是一个初学者。如果您可以回答,请给出答案,不要踩他。 - Bugster
1个回答

6

大多数使用 Allegro 制作游戏的人都使用固定间隔计时系统。这意味着每秒 X 次(通常为 60 或 100),您会处理输入并运行逻辑循环。然后,如果您有剩余时间,您会绘制一帧图形。

要创建一个以 60 FPS 计时并将其注册到事件队列中的计时器:

ALLEGRO_TIMER *timer = al_create_timer(1 / 60.0);
ALLEGRO_EVENT_QUEUE *queue = al_create_event_queue();

al_register_event_source(queue, al_get_timer_event_source(timer));

现在在你的主事件循环中:

al_start_timer(timer);
while (playingGame)
{
  bool draw_gfx = false;

  do
  {
    ALLEGRO_EVENT event;
    al_wait_for_event(queue, &event);

    if (event.type == ALLEGRO_EVENT_TIMER)
    {
      do_logic();
      draw_gfx = true;
    }
    else if (event.type == ... )
    {
      // process keyboard input, mouse input, whatever
      // this could change the direction the snake is facing
    }
  }
  while (!al_is_event_queue_empty(queue));

  if (draw_gfx)
  {
    do_gfx();
    draw_gfx = false;
  }
}

所以现在在do_logic()中,你可以使你的蛇朝着它面对的方向移动一个单位。这意味着它将每秒移动60个单位。如果需要更精细的控制,可以使用小数单位。你可能希望查看一些随Allegro附带的演示,因为它们具有完整功能的事件循环。但是将其作为单个SO答案包含太多信息。

1
在失去获得好答案的希望后,我得到了这个答案。我无法感谢你更多,你真的太棒了,我立即接受了。谢谢! - Bugster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接