教程:游戏控制器和轴

教程:游戏控制器和轴

在关于 HID 控制器的上一篇教程中,我们向您展示了如何读取控制器上的按钮输入。一般来说,控制器按钮会产生简单的“按下”或“松开”值,因此您可以轻松确定玩家是否正在与该按钮交互。

关于模拟控制

相比之下,模拟控制更为复杂。它们测量几乎无限多的潜在值,这些值必须从其模拟“无穷”转换为离散的数字值。在 Corona 中,这些值通常在 -1.01.0 之间,并且在两者之间的任意位置都有一组非常精确的值。更复杂的是,某些控件具有两个关联值——例如,模拟摇杆可以在任意方向上下移动不同的距离,也可以左右移动。诸如“扳机”之类的其他控件会生成 0.01.0 之间的值,您挤压扳机的程度越大,该值就越大。广义而言,我们将这些控制值称为。例如,左模拟摇杆同时具有X 轴Y 轴。相比之下,右扳机只有一个轴要测量。

在硬件级别,模拟摇杆通常依赖弹簧将摇杆推回中立中心位置。但是,这些弹簧并不总是将摇杆推回到其完美的 0 值。事实上,即使没有触摸控件,摇杆也可能是“嘈杂的”并生成事件。在内部,Corona 尝试尽量减少这种噪音,但由于控制器差异很大(即使是来自同一制造商的控制器),您应该在模拟摇杆处理中考虑一定的“松动”。

另一个需要解决的问题是制造商分配给其控制器的各种轴编号。例如,OUYA 控制器上的右扳机是轴编号 6,但在 DualShock 控制器上,同一控件是轴编号 14。一般而言,有两种方法可以处理此问题

  1. 构建一个类似于许多 PC 游戏中的映射屏幕,让玩家有机会按下各种按钮和控件,然后收集这些值并将轴编号分配给每个特定的控件。如果您预计玩家可能会使用您知之甚少的控制器,这可能是处理设备的最佳方式。
  2. 构建您要支持的特定控制器的映射系统。由于您事先知道每个控制器的轴映射到什么,因此您可以构建一个输入表。当然,在测试新的控制器时,您仍然需要确定这些值是什么。

映射系统

在本教程中,我们将探索“已知”控制器的基本映射系统。为了使本教程相对简单,我们只包括两个控制器,但您可以重复此基本模式来处理其他控制器。让我们看一些基本代码


第一个代码块基于我们要支持的控制器创建了一个表:标准的 OUYA 控制器和 DualShock 控制器。第二个表将物理控制名称映射到特定的数字。稍后,我们将执行代码来显示应该输入到此表中的实际值。

基本游戏设置

让我们探索一个简单的游戏,其中包含两个可以使用控制器操作的玩家


每个玩家都是一个彩色的正方形——一个绿色和一个红色——它们都从屏幕的中心开始。我们为每个玩家添加了一些属性,这些属性代表沿 X 轴和 Y 轴的移动。左摇杆用于移动玩家,右摇杆用于旋转玩家。为了好玩,我们将使用扳机来更改玩家的颜色。由于我们的轴事件不是连续的,因此我们需要使用 "enterFrame" 侦听器在按住摇杆时移动我们的玩家(此侦听器也将管理玩家旋转)。

下一步是一个函数,该函数根据摇杆按住位置的 XY 计算玩家旋转角度。请注意,您会获得一个 X 移动的事件和一个 Y 移动的事件。因此,您必须存储为 X 生成的最后一个值,以便在收到 Y 事件时,可以比较这两个值。同样,如果您收到一个 X 事件,您必须有权访问先前保存的 Y 事件。

游戏循环

现在,让我们检查一下监视控制器输入所需的游戏循环

轴移动

使用 XY 值进行移动非常简单。如果您只是想四处移动,则可以应用来自两个轴事件的值。此时,您可以应用物理脉冲或移动,或者在这种情况下,只需应用来自控制器的值。旋转比较棘手——取决于旋转应该做什么,您可能必须将 XY 转换为角度。您还可以考虑使用摇杆按下的距离来确定旋转速度。由于用于旋转的 XY 值来自两个单独的事件,因此您需要存储这两个值并根据这些值执行移动。

让我们看一下管理轴数据的实际代码

初始化控制器

最后,我们需要初始化所有内容,包括映射控制器


上面的代码循环访问 inputDevices[deviceIndex]:getAxes() 函数返回的轴列表。我们很可能不需要返回的所有轴。这就是我们使用本教程顶部的两个数据表来选择我们找到的轴并将轴编号存储到第二个表中的地方。

注意

请注意,游戏控制器可能会耗尽电池电量并会在没有警告的情况下“掉线”。玩家也可能想在游戏中途更换控制器,因此“操纵杆 2”实际上是玩家 1。您有责任使用 inputDeviceStatus 事件来管理这些事件

总结

本教程应该让您快速了解控制器上的轴类型输入和基本的映射系统。


Rob Miracle
[email protected]

Rob 是 Corona Labs 的开发者关系经理。除了热衷于帮助其他开发人员使用 Corona 制作精彩游戏外,他还喜欢在业余时间制作游戏。自 1979 年以来,Rob 一直在从个人计算机到大型计算机的各种平台上编写游戏代码。他在游戏行业拥有超过 16 年的专业经验。

4 条评论
  • Anton
    发布于 03:52h,9 月 25 日

    何时添加对 Mac 模拟器键盘控制的支持?现在为 Android、Ouya 开发应用程序非常不方便。

    早在 iOS 7 中就出现了对操纵杆的维护,您是否计划添加支持?

    • Rob Miracle
      发布于 16:24h,9 月 25 日

      工程部门正在研究何时可以将其安排在日程中。我们的重点是推出对 OUYA 的支持,并且当时 iOS 中没有这些功能。

      • Rob Miracle
        发布于 16:26h,9 月 28 日

        只是一个更新,一些键盘和鼠标支持已添加到 Mac sim(不是 iOS)的最新每日构建中,但这只是计算机的键盘。

        • Ernest Szoka
          发布于 12:40h,1 月 28 日

          鼠标和键盘支持在 iOS 设备的 PC sim 上不起作用,但在 Android 上起作用!