2012-04-04 90 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; 
}