基于时间的事件处理
Time based event handling
我目前正在编写一个简单的游戏,以便学习如何在C++中使用SFML。到目前为止,事情进展顺利,我对SFML的大多数事情都有了基本的了解。我遇到的问题是找到一种有效的方式和基于时间的事件。
我正在开发的游戏是一款非常简单的太空入侵者式游戏,在关卡中,敌人会在预定义的时间出现一波又一波。到目前为止,我有一个事件类,它保存并控制每个调用的事件应该发生的事情,以便允许我多次重用简单的事件。到目前为止,我通过利用SFML clock进行循环来触发这些事件,并且游戏循环的每次迭代都通过当前级别的所有事件的向量,并将时钟上经过的时间与要调用的事件的指定时间进行比较。问题是,我必须在每次游戏循环迭代时检查整个事件向量,如果事件列表足够长,我担心它会开始对游戏性能产生影响。
我有一个想法,为每个事件在时间线上的位置提供一个简单的数字Id,并简单地存储下一个应该运行的事件。这样,我只需要在每个循环迭代中检查一个事件的时间,虽然我认为这会很好地工作,但我很好奇,是否有可能找到一种更有效的方法,不需要检查每个循环迭代?我研究了一些事件驱动的编程,但找不到太多与基于时间的事件相关的内容。
因此,我想知道是否有人对时间表或基于时间的事件触发有任何经验,并且有任何技巧或资源可以让我找到一个更有效的想法?任何帮助都将是伟大的,谢谢!
您建议的方法是在游戏循环中每次只进行一次比较。没有比这更快的了。
要允许多个事件在同一时刻触发,请使用multimap
,其中键是事件时间,值是事件本身。然后将按时间对多映射进行排序。
每次通过游戏循环,都要做这样的事情(伪代码):
now = getCurrentTime()
while not events.isEmpty() and events.firstElement().key() < now:
e = events.firstElement().value
e.execute()
events.removeFirst()
根据事件的时间对向量进行排序,然后只存储到目前为止通过向量的距离。在每个循环中,您将推进该位置,直到下一个事件还不应该发生,并启动刚才迭代的事件。
std::vector<Event> time_line;
size_t time_line_position;
void fire_new_events(Time t) {
size_t new_time_line_position = time_line_position;
while(new_time_line_position < time_line.size()
&& time_line[new_time_line_position].time <= t)
++new_time_line_position;
fire_events(time_line.begin() + time_line_position,
time_line.begin() + new_time_line_position);
time_line_position = new_time_line_position;
}
- 给定顺序中的事件处理
- C++事件系统 - 多态事件和事件处理程序
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 如何在c++多线程中匹配处理时间和接收时间
- 更好的事件处理机制?
- 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?
- "动态创建的事件处理程序"复选框
- OpenCV的卡尔曼滤波器过渡矩阵如何处理时间(如t和t^2)进行运动预测?
- Wxwidgets - 如何添加调整大小事件处理程序以使"X"绘图随窗口调整大小?
- Qt 键按事件处理程序仅在按下 ctrl、alt 或 shift 键时做出反应
- openMp 动态调度与按处理时间排序任务时的 LPT 调度相同吗?
- 类成员作为 C++ 中 C 样式事件的事件处理程序
- C 设计事件处理程序类
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 如何在 c++ linux 中创建事件处理程序
- 解除 lambda 事件处理程序的绑定
- 这是MFC C 中单个选择的ComboBox的事件处理程序
- 审核的实时事件处理 C/C++
- 指纹读取器 - 从 C# 代码创建事件处理程序到C++的问题
- 基于时间的事件处理