XNA处理组合按键
本文关键字:组合 处理 XNA | 更新日期: 2023-09-27 18:03:31
我读过一些文章,但是在尝试实现一些之后,总是得到同样的问题,
快速提示:This Is Home Work
我正在用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语句中处理箭头键,让线程休眠一小会儿,然后如果箭头键和按钮(即a被按下)
我的第二个问题,我正在讨论执行的问题,但如果我这样做了,那么SSB玩家就会知道在操纵杆上稍微向前按一下,然后按下a键会产生一个快速的踢/刺,但更用力的按键(操纵杆移动得更远/可能更快)会产生一个粉碎的动作,我该如何执行一个系统来识别轻键和重键?
你的问题是XNA默认设置为60Hz循环,所以如果你的游戏节奏足够快,那么你就要每16毫秒检查一次按键。这给了你一个非常小的窗口来同时敲击两个键——如果两个键间隔超过10毫秒,那么它们可能会在两个独立的更新循环中结束,因此被计数为单个按键而不是组合移动。人类的反应时间约为150-300毫秒,你完全在人类输入的不准确性范围内。
我可能会考虑使用输入缓冲区;就像KeyValuePair
的List
。每次循环时,你都要将当前按下的按钮与当前时间一起添加到缓冲区中,删除时间比特定时间范围更早的任何内容,然后检查缓冲区的内容是否与任何组合移动相匹配。这既允许即时连击,也允许连续连击(游戏邦注:例如《A, A, Left+B
》)。在此期间,你可能需要考虑取消由单个按键触发的任何移动的方法——如果你识别出left, jump&punch
的组合,那么你会想要以某种方式阻止他们跳跃和击打,而不是做组合触发的飞行上勾拳。
至于轻/重按键,我不认为这是可能的方式在你的想法-电脑键盘是相当简单的设备;按钮是简单的开/关单位,没有关于压力或速度的信息。您可以查看按键之间的间隔有多远——如果使用所描述的缓冲区方法,那么您可以使用与按键一起存储的时间来获得按键之间的时间间隔。