我正在尝试创建一个函数,使我能够识别一些输入组合,例如街头霸王(或其他格斗游戏)组合(向下,向下+向右,向右+ 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