3

我已经阅读了一些处理此问题的文章,但是在尝试实施了一些之后,总是遇到同样的问题,

快速说明:这是家庭作业

我正在使用 XNA 为我的游戏设计课重新创建 Super Smash Brothers(N64 风格)。现在我有 2 个与 SSB 密切相关的问题,任何熟悉 SSB 的人都会知道组合攻击,即按“Forward A”、“Up 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 会快速踢/刺,但按键会更硬(操纵杆移动得更远/可能更快 w/ e)将创建一个粉碎动作,以及我如何实现一个系统来识别轻重按键之间的想法?

4

1 回答 1

3

您的问题是 XNA 默认为 60Hz 循环,因此如果您的游戏时钟足够快,那么您每 16 毫秒检查一次按键。这为您提供了一个非常小的窗口,可以在其中同时按下两个键 - 如果两个键的下降时间间隔超过大约 10 毫秒,那么它们可能会以两个单独的更新循环结束,因此被计为单个按键而不是组合移动. 人类的反应时间约为 150-300 毫秒,您完全可以在人类输入的误差范围内。

我可能会考虑使用输入缓冲区;List类似的东西KeyValuePair。每次循环时,您都将当前按下的按钮与当前时间一起添加到缓冲区,删除时间早于某个时间跨度的任何内容,然后检查缓冲区的内容是否与任何组合移动匹配。这允许瞬时组合以及顺序组合(例如,A, A, Left+B会起作用)。您可能需要考虑某种方式来取消同时由单个按键触发的任何移动 - 如果您识别出其中的一个组合,left, jump&punch那么您将希望以某种方式阻止它们跳跃和出拳,而是执行组合触发的飞行上勾拳.

至于轻/重按键,我认为这不可能按照您的想法进行-计算机键盘是非常简单的设备;这些按钮是简单的开/关单元,没有关于压力或速度的信息。您可以查看按键之间的距离 - 如果您使用所描述的缓冲区方法,那么您可以使用按键存储的时间来获取按键之间的时间。如果该时间长于某个间隔,则使用较弱或较慢的移动。

于 2013-03-13T12:16:21.517 回答