睡觉或等待不会阻止整个计划?

时间:2016-01-18 12:35:51

标签: c++ timer sdl wait sleep

所以我从头开始编程很新,主要使用统一几年,直到现在,所以我的一般编程知识非常好。夏天开始在大学开始学习游戏开发,虽然我们从头开始编程,作为一项任务,我们必须在课堂上一起制作的2D引擎中制作一个简单的游戏。

所以我决定制作的游戏是一个炸弹人的副本,我已经到达了我现在制造炸弹功能的地方。

我遇到的问题是我不知道如何恰当地添加一个计时器来计算炸弹爆炸的时间,以便玩家可以避开它。

我已经尝试过SDL_Delay和_sleep,它们只是暂停整个程序,因此不能正常工作,我已经四处寻找更多选项,但却没有真正理解它是如何工作的。如果我能得到一些示例和链接到页面,解释如何正确地做出类似这样的工作(简单而小巧的事情:P)那么我将非常感激!

请注意,我们在引擎中使用SDL。

谢谢!

1 个答案:

答案 0 :(得分:4)

通常情况下,游戏使用循环,您可以在其中读取用户输入(您可能正在使用SDL_PollEvent),在短时间内提升游戏状态并绘制屏幕。这个循环通常称为游戏循环,渲染循环或主循环。

延迟事件(例如定时爆炸)的简单,准确和典型的方法是将未来时间存储到队列中。然后,每次游戏状态前进时,检查第一个,因此检查队列中最旧的时间戳,如果当前时间高于存储的时间,那么我们知道现在应该发生的事情,你可以调用执行的函数事件毫不拖延。然后从队列中删除时间戳并检查下一个时间戳,直到只剩下未来事件或队列为空。

如果事件延迟有所不同,那么您需要使用优先级队列来始终获取应该触发的事件。

skypjack在评论中指出,如果你需要实现暂停游戏,这是一个有问题的方法。这可以通过不测量挂钟来解决,而是使用在游戏暂停时从挂钟漂移的单独模拟时间。他们还提出了一个更简单的解决方案:

  

存储timeToEvent(要经过)并递减它,以便将游戏时间与真实时间分开。一旦它<= 0,就是它的时间。

这种方法更简单,但检查截止日期到期的开销更大。