2014-09-04 48 views
1

我正在嘗試創建一個函數,使我能夠識別一些輸入組合,例如街頭霸王(或其他格鬥遊戲)組合(向下,向下+向右,向右+ punch = hadoken),以供我的視頻遊戲使用。
我的想法是將輸入放入堆棧,然後識別組合。
問題是:
當遊戲循環運行時,只有一段時間按下游戲鍵,遊戲纔會識別X次輸入(X =按下鍵時通過的循環次數)。 我試圖用定時器限制輸入的數量,但它似乎不是一個好的解決方案。如何識別輸入組合?

有什麼想法?

+0

記錄密鑰更改狀態和存儲按鍵事件的時間。 – molbdnilo 2014-09-04 15:13:43

回答

0

組合是一系列關鍵事件。因此,你可以在序列的當前事件中使用某種指針/迭代器,然後當你從窗口中獲得一個新的sf::Event時,你更新指針/迭代器:如果它不匹配下一個,你重置指針/迭代器,否則你增加它。如果您到達序列的最後一個事件,則您有一個有效的組合。

下面是一些僞代碼,可能會更清楚:

class Combo 
{ 
    sequence events; 
    iterator it = events.begin(); 
    bool handle(event e) 
    { 
     if (e == *it) 
     { 
      if (it == events.end()) 
      { 
       it = events.begin(); 
       return true; 
      } 
      else 
      { 
       ++it; 
       return false; 
      } 
     } 
     else 
     { 
      it = events.begin(); 
      return false; 
     } 
    } 
} 

void Manager::update(event e) // or whatever class you have 
{ 
    sequence combos = ...; 
    for (c : combos) 
    { 
     if (c.handle(e)) 
     { 
      // perform combo 'c' 
     } 
    } 
} 

這樣,你不需要任何定時器或堆棧。

+0

這似乎是一個好主意;我已閱讀過SFML文檔中的「平滑移動只能通過使用sf :: Keyboard實時鍵盤輸入來實現」。 你認爲使用sf :: Keyboard移動字符並使用sf :: Event來處理連擊可能是正確的嗎? – LolloFake 2014-09-04 17:42:28

+0

我想你是指[本教程](http://www.sfml-dev.org/tutorials/2.0/window-events.php#the-keypressed-and-keyreleased-events)。小心不要誤解它的含義。 [這裏](https://github.com/LaurentGomila/SFML/issues/483)是一個簡短的討論,可能會給你更多的見解,特別是Kynnath的評論。無論如何,用你找到的最簡單的方法去做,如果結果不夠令人滿意,試試另一個。 – Hiura 2014-09-04 18:10:25

+0

恩我不知道這個事實。 很高興知道。 非常感謝。 – LolloFake 2014-09-04 19:04:45