我正在使用 allegro 5 用 c++ 编写游戏。Allegro 5 的事件堆叠在事件队列中(如鼠标单击或在 1/FSP 时间后计时)。所以我的问题是我的游戏主循环的逻辑应该如何,或者因为它是基于事件的,我可以在没有主循环的情况下实现它?
任何想法如何真正的游戏做到这一点?链接会很好。
我没有使用 Allegro 的经验,但是在使用 SFML 并使用 OpenGL 渲染游戏时,我自己会轮询事件队列作为我的主循环的一部分。类似于下面的伪代码(但更抽象):
while(game_on)
{
auto events = poll_occured_events();
for_each(events, do_somewithng_with_event);
render_game();
}
到目前为止似乎工作正常......我猜在 Allegro 中可能会有类似的事情。事件驱动的游戏很棘手,因为您需要不断更新游戏。
您可以(可能)在另一个线程中拥有主循环,然后在事件线程和游戏线程之间同步......
我对 Allegro 也没有任何经验,但逻辑是一样的。
(所谓)真实游戏也有游戏循环,但不同之处在于它们使用并行工作但在不同时间间隔内工作的线程。例如,物理计算、人工智能、游戏玩法、声音、渲染有不同的线程……因为用户事件通常会在游戏事件之前被收集(正如 Max 建议的那样)并消耗到下一帧(实际上有些是在例如 5 帧)。
由于一帧可能太长,所有来自操作系统的事件都会被游戏收集,因此这些输入被称为缓冲输入。还有另一种方法称为无缓冲输入,它不能离散地工作,而是在游戏循环期间在查询它的实例上对其进行测试。
如果用户输入非常重要并且您根本不想丢失任何输入,那么您可以使用缓冲的,否则没有缓冲的。然而,无缓冲可能会很棘手,尤其是在调试期间。