【问题标题】:Time based event handling基于时间的事件处理
【发布时间】:2012-04-04 17:02:08
【问题描述】:

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

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

我有一个想法,为每个事件在时间轴中的位置提供一个简单的数字 ID,并简单地存储下一个应该运行的事件,这样我只需检查每个循环迭代的一个事件的时间,而 while我想这会很好地工作,我很好奇是否有一种更有效的方法不需要检查每个循环迭代?我对事件驱动编程进行了一些研究,但找不到与基于时间的事件特别相关的内容。

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

【问题讨论】:

  • 事件应该运行的时间它的ID,不需要另一个数字(除非你需要它用于其他目的)。
  • 保持事件列表按时间排序,这样您只需要查看第一个条目。

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


【解决方案1】:

您建议的方法只是在游戏循环中每次进行一次比较。没有比这更快的了。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 2020-04-06
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      相关资源
      最近更新 更多