我已经阅读了一些处理此问题的文章但是在尝试实现一些之后,总是得到同样的问题,
快速说明:这是家庭作业
我正在使用XNA为我的游戏设计类重新创建Super Smash Brothers(N64风格)。 现在我有两个密切相关的问题,任何熟悉SSB的人都会知道组合攻击,即按“前进A”,“上升B”等等。我有一个正在工作的Yoshi,你有时甚至可以关闭他的组合,但是我发现的主要问题是,除非按键在同一时刻按下另一个动作,即对于向上A,跳跃将会消失
目前我的if语句是......
if (state.IsKeyDown(Keys.Up) && state.IsKeyDown(Keys.B))
{
actionComponent.curAction.secondaryAction = SecondaryAction.Stand;
actionComponent.curAction.primaryAction = PrimaryAction.Up_B;
}
else if (state.IsKeyDown(Keys.Up) && state.IsKeyDown(Keys.A))
{
//Console.WriteLine("This is C#");
actionComponent.curAction.primaryAction = PrimaryAction.Up_A;
actionComponent.curAction.secondaryAction = SecondaryAction.Smash;
spriteComponent.curColumn = 0;
}
else if (state.IsKeyDown(Keys.Up))
{
actionComponent.curAction.secondaryAction = SecondaryAction.Jump;
actionComponent.curAction.primaryAction = PrimaryAction.None;
}
我显然对于每个可能的动作都有更多,但它们都被安排,以便单键按下是最后一个,所以它可以注册其他的,但除非我在同一时刻按它们不会注册密钥 - 按 - 我尝试了一些想法,在if语句中处理箭头键,在线程中暂停一小段时间,然后如果按下箭头键和按钮即小鸡,则按下
我的第二个问题,我正在讨论实施,但如果我这样做,SSB播放器会知道稍微向前按操纵杆然后按A将快速踢/ Jab但是更难按键(操纵杆移动更远/可能更快的w / e)将创建一个粉碎的动作,并想法我如何实现一个系统来识别轻重按键?
答案 0 :(得分:3)
你的问题是XNA默认为60Hz循环,所以如果你的游戏时间足够快,那么你每16毫秒检查一次按键。这给了你一个小小的窗口,可以击中两个键 - 如果两个键相隔超过大约10毫秒,那么它们可能最终会分成两个独立的更新循环,因此被计为单个按键而不是组合动作。由于人类的反应时间大约为150-300毫秒,因此您在人类输入中的误差范围内就完全没有了。
我可能会考虑使用输入缓冲区;类似于List
的{{1}}。每次循环时,将当前正在按下的按钮与当前时间一起添加到缓冲区,删除时间早于某个时间跨度的任何内容,然后检查缓冲区的内容是否与任何组合移动匹配。这允许瞬时组合以及连续组合(例如,KeyValuePair
将起作用)。在此期间你可能需要考虑一些取消由单个按键触发的动作的方法 - 如果你认识到A, A, Left+B
的组合,那么你会想要以某种方式阻止他们跳跃和冲击而是做飞行组合触发的勾拳。
对于轻/重按键,我认为这不可能是你想到的方式 - 电脑键盘是非常简单的设备;按钮是简单的开/关单元,没有关于压力或速度的信息。您可以查看按键的距离 - 如果使用所描述的缓冲方法,则可以使用按键存储的时间来获取按键之间的时间。如果该时间长于某个时间间隔,则使用较弱或较慢的移动。