2012-04-04 61 views
0

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

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

我有一个想法,为每个事件提供一个简单的数字ID作为它在时间轴上的位置,并简单地存储下一个应该运行的事件,那样我只需要检查每个循环迭代中一个事件的时间,并且虽然这将工作得相当好,我想,我很好奇,如果一个更有效的方法,不需要检查每个循环迭代是可能的?我看了一下事件驱动编程,但找不到与基于时间的事件有很大关系。

因此,我想知道是否有人有时间轴或基于时间的事件触发的任何经验,并会有任何提示或资源,我可以看看找出一个更有效的想法?任何帮助将是伟大的,谢谢!

+0

事件应该在**处运行的时间是其ID,不需要另一个数字(除非您需要其他用途)。 – 2012-04-04 17:06:39

+0

保持事件列表按时间排序,因此您只需查看第一个条目即可。 – 2012-04-04 17:15:23

回答

2

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

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

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

now = getCurrentTime() 
while not events.isEmpty() and events.firstElement().key() < now: 
    e = events.firstElement().value 
    e.execute() 
    events.removeFirst() 
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; 
}