基于时间的事件处理

时间:2012-04-04 17:02:08

标签: c++ events time event-handling sfml

我目前正在编写一个简单的游戏,以学习如何在C ++中使用SFML。到目前为止,事情进展顺利,我对SFML的大多数事情有基本的了解。我遇到的问题是找到一种有效的方式和基于时间的事件。

我正在进行的游戏是一个非常简单的太空侵略者esque游戏,它有一波敌人在等级的预定时间进入。截至目前,我有一个事件类,它保存并控制每个被调用事件应该发生的事情,以便允许我多次重用简单事件。截至目前,我通过循环使用SFML cloock并且游戏循环的每次迭代运行通过当前级别的所有事件的向量并将时钟上的经过时间与事件的指定时间进行比较来触发这些事件。叫做。问题是我必须在每次游戏循环迭代时检查整个事件向量,如果事件列表足够长,我担心它将开始对游戏性能产生影响。

我有一个想法,为每个事件在时间轴中的位置赋予一个简单的数字ID,并简单地存储下一个应该运行的事件,我只需要检查每个循环迭代一个事件的时间,而我认为这样可以很好地工作,我很好奇是否可以使用一个不需要检查每个循环迭代的更有效的方法?我看了一下事件驱动编程,但找不到与基于时间的事件有多大的关系。

因此,我想知道是否有人对时间轴或基于时间的事件触发有任何经验,并且我会有什么提示或资源可以看出来找出更有效的想法?任何帮助都会很棒,谢谢!

2 个答案:

答案 0 :(得分:2)

你建议的方法是每次通过游戏循环只进行一次比较。它没有比这更快。

要允许多个事件在同一时刻触发,请使用multimap,其中键是事件时间,值是事件本身。然后,多重图将按时间排序。

每次通过游戏循环,做这样的事情(伪代码):

now = getCurrentTime()
while not events.isEmpty() and events.firstElement().key() < now:
  e = events.firstElement().value
  e.execute()
  events.removeFirst()

答案 1 :(得分:0)

根据事件的时间对矢量进行排序,然后存储到目前为止你通过矢量的距离。然后每个循环你将推进该位置,直到下一个事件不应该发生,并触发你刚刚迭代的事件。

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;
}