我已经阅读了一些涉及此问题的文章,但是在尝试实施一些之后,总是遇到同样的问题,
快速说明:这是家庭作业
我正在使用 XNA 为我的游戏设计课程重新创建 Super Smash Brothers(N64 风格)。
现在我有两个问题密切相关,熟悉 SSB 的人都会知道组合攻击,即按“前进 A”、“向上 B”等。我有一个当前正在工作的耀西,有时你甚至可以关闭他的组合,但是我发现的主要问题是,除非在完全相同的时刻按下按键另一个动作,即向上 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 会快速踢/刺拳,但要按更用力的按键(操纵杆移动得更远/可能更快) e)将创建一个粉碎动作,以及如何实现一个系统来识别轻按键和重按键的想法?
您的问题是 XNA 默认为 60Hz 循环,因此如果您的游戏时钟足够快,那么您将每 16 毫秒检查一次按键。这为您提供了一个非常小的窗口,可以在其中按下两个键 - 如果两个键按下的时间间隔超过大约 10 毫秒,那么它们可能最终会进入两个单独的更新循环,从而被计为单个按键而不是组合移动。由于人类反应时间约为 150-300 毫秒,因此人类输入的不准确性完全在您的范围内。
我可能会考虑使用输入缓冲区;像一个List
of KeyValuePair
。每次循环时,您都将当前按下的按钮与当前时间一起添加到缓冲区,删除时间早于特定时间跨度的任何内容,然后检查缓冲区的内容是否与任何组合移动相匹配。这允许瞬时组合以及顺序组合(例如,A, A, Left+B
会工作)。您可能需要寻找某种方法来取消同时按下单个按键所触发的任何移动 - 如果您认识到以下组合left, jump&punch
然后你会想以某种方式阻止他们跳跃和拳击,而是进行连击触发的飞行上勾拳。
至于轻/重按键,我认为这不可能像你想象的那样 - 计算机键盘是非常简单的设备;这些按钮是简单的开/关单元,没有关于压力或速度的信息。您可以查看按键之间的距离 - 如果您使用所描述的缓冲区方法,那么您可以使用按键存储的时间来获取按键之间的时间。如果该时间长于某个间隔,则使用较弱或较慢的动作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)