gpt4 book ai didi

c# - XNA 处理按键组合

转载 作者:行者123 更新时间:2023-11-30 16:19:21 25 4
gpt4 key购买 nike

虽然我已经阅读了一些与此相关的文章,但是在尝试实现一些之后,总是遇到同样的问题,

快速说明:这是家庭作业

我正在使用 XNA 为我的游戏设计类(class)重新制作《任天堂明星大乱斗》(N64 风格)。现在我有两个密切相关的问题,任何熟悉 SSB 的人都会知道组合攻击,即按“前进 A”、“向上 B”等。我有一个正在工作的 Yoshi,你有时甚至可以关闭他的组合,但是我发现的主要问题是,除非在同一时刻按下键,否则另一个 Action ,即对于 Up 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;
}

我显然对每个可能的 Action 都有更多,但它们都是这样安排的,所以单个按键是最后一个,因此可以注册其他按键,但除非我同时按下它们,否则它不会注册按键 -按 - 我尝试过的一些想法,在 if 语句中处理箭头键,使线程休眠片刻,然后检查是否按下了箭头键和按钮,即 A)

我的第二个问题,我正在讨论是否实现,但如果我这样做,SSB 玩家会知道稍微向前按操纵杆,然后按 A 会快速踢/刺拳,但更用力的按键(操纵杆移动得更远/也许faster w/e) 将创造一个粉碎 Action ,以及我如何实现一个系统来识别轻按键和重按键的想法?

最佳答案

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

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

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

关于c# - XNA 处理按键组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15375001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com