XNA 处理按键组合

2023-12-13

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

快速说明:这是家庭作业

我正在使用 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(使用前将#替换为@)

XNA 处理按键组合 的相关文章

  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 如何在iPhone SDK中将SQLite文件导出为CSV文件

    在我的应用程序中 我想将 SQLite 数据库文件导出到 CSV 文件 你能建议我如何做到这一点吗 谢谢 首先 您需要确保您正在使用FMDB访问数据库 因为在 Objective C 中直接使用 SQLite C API 的人都是受虐狂 你
  • WPF 用鼠标移动元素

    我正在尝试在 WPF 应用程序中用鼠标移动按钮 XAML Grid 是结构的根
  • CPython 的垃圾收集是否进行压缩?

    我正在与一位朋友交谈 比较语言 他提到 Java 的自动内存管理优于 Python 因为 Java 可以进行压缩 而 Python 则不能 因此对于长时间运行的服务器来说 Python 是一个糟糕的选择 在不讨论哪个更好或更坏的情况下 他的
  • JSON.stringify 函数

    我有一个具有一些属性和方法的对象 如下所示 name FirstName age 19 load function uniq 0 5233059714082628 我必须将此对象传递给另一个函数 因此 我尝试使用 JSON stringif
  • 云上的丑陋渲染

    我正在尝试实现代码本教程 但比例要大得多 半径 100000 单位 我不知道大小是否重要 但在我的地球上渲染云有一个奇怪的渲染 正如教程中所做的那样 我使用两个球体和三个纹理 地球贴图 凹凸贴图 云 Here the result that
  • 在 Win32 中从字符串中解析日期

    我有一个包含日期的字符串 另一个包含第一个字符串的日期格式的字符串 我可以调用一个函数将该日期转换为类似 SYSTEMTIME 结构的函数吗 基本上 我想要相反的获取日期格式 它并不完全符合您所描述的功能 但我会首先使用COleDateTi
  • 通过动作脚本关闭网络摄像头的使用

    有没有办法 如何在动作脚本中关闭网络摄像头连接 我正在通过 Camera getCamera 打开流 问题是 释放网络摄像头实例后 我尝试了很多方法 网络摄像头上的光仍然是光束 在 macbook pro 上尝试过 您只需致电video a
  • 带刻面的堆叠条的反向填充顺序

    我不知道如何反转填充顺序 基本上 我试图让指南和填充匹配单词从正到负的内在顺序 指南和填充顺序从上到下应该是 比我预期的要好得多 填充在最顶部 图例的顶部 比我预期的要好一点 关于我的预期 比我想象的差一点 比我预期的要糟糕得多 填充在最底
  • 查看SQL Server数据库对象列表时如何识别系统对象?

    我试图列出服务器上所有数据库中的所有存储过程 但我似乎无法可靠地过滤掉系统对象 我正在使用 SELECT FROM sysobjects WHERE id gt 100 这似乎在除 MSDB 之外的每个数据库中都运行良好 MSDB 充满了大
  • 如何使用经典蓝牙代替 LE

    在参照丹尼斯 马修斯的回答如何在 iOS 上指定经典蓝牙而不是 LE 是否有不同的 api核心蓝牙框架 Joels 有一种非常清晰的方法可以在 iOS 上使用经典蓝牙 它具有外部附件框架 但是 除了经典蓝牙之外 它还包括直接硬件连接 您需要
  • 有效使用 UncaughtExceptionHandler

    我最近了解了 Java 1 5 的这个功能 并开发了一个示例代码来使用它 我的目标是当线程由于未捕获的异常而死亡时重新启动线程 public class ThreadManager public static void main Strin
  • 为什么标签小部件中的文本周围出现难看的大括号? - Tkinter

    我的标签小部件中的文本周围有大括号 输出是 Total tries 0 代替Total tries 0 这是我的代码的简短版本 class Cell def check self mem tries 1 mem update tries c
  • UISearchController更新搜索结果问题

    我的问题是我已经实施了UISearchController在 Swift 3 中 当我尝试过滤它时 它很容易过滤简单数组 但我的情况有点不同 我有一个数组 我从中获取所有数据SQLite database在类中 所以它是类的数组 manag
  • 断开各个对等点与 MCSession 的连接?

    如果我有一组已连接的对等点 假设有 3 个 a gt b a gt c a gt d 我只想断开对等点 c 的连接 我应该做什么 我看到对类似问题的一个答复指出 您只能断开 您自己 与会话的连接 这意味着在上述情况下 如果我这样做 mySe
  • 在 MATLAB GUIDE 中显示大型文本文件的最佳方式是什么?

    如何使用 MATLAB GUIDE 控件在 GUI 中显示文本文件的内容 文本文件可能很长或很宽 因此它应该能够具有垂直和水平滚动条 多行编辑框可能是显示文本的最佳选择 例子 read text file lines as cell arr
  • 函数可选参数DATE类型失败

    我有一个函数可以查找下周一的日期 当没有传递可选日期参数时 它将变为默认值零 我想我已经添加了注释来解释问题 Function NextMondayFromADateOrToday Optional StartDate As Date As
  • 如何沿矩阵轴执行滚动求和?

    给定矩阵X with T行和列k T 50 H 10 k 5 X np arange T reshape T 1 np ones T k 如何执行滚动累积和X沿着行轴有滞后H Xcum np zeros T H k for t in ran
  • 如果我不“删除”会发生什么? [复制]

    这个问题在这里已经有答案了 如果我在执行期间分配一些内存但从不调用会发生什么delete程序终止 操作系统会释放我分配的所有内存并且不会 浪费 任何内存吗 或者在计算机重新启动之前我会丢失一部分内存吗 显然 我知道良好的编码实践是确保删除不
  • XSLT:多次复制对象 xml,同时递增属性和值

    我有一个如下所示的 xml 我想复制 n 次 同时递增其元素之一和属性之一 XML 输入
  • XNA 处理按键组合

    我已经阅读了一些涉及此问题的文章 但是在尝试实施一些之后 总是遇到同样的问题 快速说明 这是家庭作业 我正在使用 XNA 为我的游戏设计课程重新创建 Super Smash Brothers N64 风格 现在我有两个问题密切相关 熟悉 S