睡眠或等待不会停止整个程序

Sleep or wait that doesnt stop the whole program?

本文关键字:程序 等待      更新时间:2023-10-16

所以我对从头开始编程很陌生,到目前为止主要使用unity已经有几年了,所以我的一般编程知识非常好。暑假后开始在一所大学学习游戏开发,尽管我们从头开始编程,作为一项任务,我们必须在课堂上一起制作的 2D 引擎中制作一个简单的游戏。

所以我决定做的游戏是炸弹人的副本,我已经走到了我现在使炸弹发挥作用的地方。

我遇到的问题是我不知道如何适当地添加一个计时器,将炸弹发射的时间倒计时,以便玩家可以避免它。

我已经尝试了SDL_Delay和_sleep,它们都只是暂停了整个程序,因此不起作用,并且我已经搜索了更多选项,但并不真正了解事情是如何工作的。如果我能得到一些扩展和页面链接,解释如何正确制作这样的东西(一些简单而小的希望:P),那么将不胜感激!

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

谢谢!

通常,游戏使用循环,在该循环中,您读取用户输入(您可能为此使用 SDL_PollEvent),在短时间内推进游戏状态并绘制屏幕。此循环通常称为游戏循环、渲染循环或主循环。

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

如果事件延迟可能有所不同,则需要使用优先级队列来始终获取接下来应触发的事件。

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

存储一个 timeToEvent(待过去)并递减它,以便您将游戏时间与真实时间分离。一旦它<= 0,就是它的时间。

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