我正在嘗試創建一個函數,使我能夠識別一些輸入組合,例如街頭霸王(或其他格鬥遊戲)組合(向下,向下+向右,向右+ punch = hadoken),以供我的視頻遊戲使用。
我的想法是將輸入放入堆棧,然後識別組合。
問題是:
當遊戲循環運行時,只有一段時間按下游戲鍵,遊戲纔會識別X次輸入(X =按下鍵時通過的循環次數)。 我試圖用定時器限制輸入的數量,但它似乎不是一個好的解決方案。如何識別輸入組合?
有什麼想法?
我正在嘗試創建一個函數,使我能夠識別一些輸入組合,例如街頭霸王(或其他格鬥遊戲)組合(向下,向下+向右,向右+ punch = hadoken),以供我的視頻遊戲使用。
我的想法是將輸入放入堆棧,然後識別組合。
問題是:
當遊戲循環運行時,只有一段時間按下游戲鍵,遊戲纔會識別X次輸入(X =按下鍵時通過的循環次數)。 我試圖用定時器限制輸入的數量,但它似乎不是一個好的解決方案。如何識別輸入組合?
有什麼想法?
組合是一系列關鍵事件。因此,你可以在序列的當前事件中使用某種指針/迭代器,然後當你從窗口中獲得一個新的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'
}
}
}
這樣,你不需要任何定時器或堆棧。
這似乎是一個好主意;我已閱讀過SFML文檔中的「平滑移動只能通過使用sf :: Keyboard實時鍵盤輸入來實現」。 你認爲使用sf :: Keyboard移動字符並使用sf :: Event來處理連擊可能是正確的嗎? – LolloFake 2014-09-04 17:42:28
我想你是指[本教程](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
恩我不知道這個事實。 很高興知道。 非常感謝。 – LolloFake 2014-09-04 19:04:45
記錄密鑰更改狀態和存儲按鍵事件的時間。 – molbdnilo 2014-09-04 15:13:43