2014-09-04 22 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