【问题标题】:How can I run a timer in C++ without interfering with my other code?如何在不干扰其他代码的情况下在 C++ 中运行计时器?
【发布时间】:2022-02-04 05:56:02
【问题描述】:

我尝试在 C++ 中使用 ANSI 序列制作一个 cmd 终端游戏,但我现在卡住了。在我的游戏中,一个角色以恒定的速度稳定地移动,而敌人的移动速度比这还要快。比如,有的快有的慢。如何为所有人设置计时器?设置计时器会暂停整个执行。我希望只为特定的精灵设置一个计时器。有没有办法做到这一点?

【问题讨论】:

  • 您是否熟悉多线程程序和一般线程?
  • 通常,在游戏中,您有一个更新循环和更新帧之间的增量时间,因此您只需将实体的速度乘以增量时间,然后将位置修改为那个值。这种解决方案不需要计时器
  • @PaulMcKenzie 那样我就不得不在我的代码中使用大量线程。有人告诉我,这样简单的应用程序不应该使用大量线程。有更好的选择吗?
  • @UnholySheep 老实说,我是在命令终端中做游戏的。我必须手动移动角色,而不是依赖另一个库或游戏引擎。我看不出如何在没有超时的情况下完成此操作,例如 标头中的 sleep() 函数。
  • 您不需要任何库或引擎来进行更新循环。这可以像 while(true) 一样简单,在迭代之间保持时间戳(或使用 Windows 消息循环)

标签: c++ visual-studio-code time sprite difference


【解决方案1】:

一个常见的解决方案是使用event loop(例如Asio C++ Librarylibeventlibuv),您可以在其中注册定时器到期的回调,并且事件循环管理定时器(和其他事件)并调用您在计时器到期时的回调。见this code example

一个更好的新选择是使用协同程序,如果有的话,Asio C++ Library can do that。协程不需要使用回调,这使得代码更简单。

在后台,所有这些库都会调用特定于平台的事件多路分离函数,例如select/epoll_wait。事件循环库在概念上对所有计时器到期进行排序,并等待最早的一个 - select 的超时参数。

【讨论】:

  • 非常感谢您的反馈。但是我在 windows cmd 终端中制作我的游戏,除了基本的 之外没有使用任何其他库,我试图想办法解决这使用 windows.h 模块中的 sleep() 函数,但时间冻结是通用的,而不是单个 ASCII 精灵(我创建的 2D 类的实例)。将初始时间存储在变量中并将其与每次迭代进行比较是一种合理的方法吗?这样一来,我就可以让它工作了。
  • @如果你坚持不使用库,那么你必须学习这些库如何管理定时器并自己实现它们。我回答的最后一段解释了如何管理多个计时器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多