LibGDX输入模块之手柄控制器

我们一直在为游戏手柄和操纵杆添加新的扩展.最终呈现给你们的是gdx-controllers,我们的第一个扩展是每个平台有不同的后端实现(其他扩展通常只是交叉编译的JNI包装器,在每个平台上使用相同的Java代码)。

此扩展的目标是提供以下功能:

  1. 枚举连接的控制器
  2. 支持每个控制器的按钮,轴,滑块,POV和加速度计
  3. 在全局或每个控制器上监听控制器事件
  4. 控制器状态轮询

我们尽量保持API尽可能的小,有可能将来继续扩展,并且无需初始化,底层后端将自动初始化它。

枚举控制器

一个或多个控制器可能连接到您的PC /设备。 Controllers类具有查询当前连接的设备的方法:

for (Controller controller : Controllers.getControllers()) {
    Gdx.app.log(TAG, controller.getName());
}

Controller #getControllers()返回的Array中的控制器的顺序通常是控制器连接的顺序。 但是你不应该过分依靠这个顺序。 请参阅下面的(dis-)connecting 设备部分。

必须在渲染线程上执行Controllers类的所有方法,即ApplicationListener的任何方法。

轮询设备状态

一旦你有一个Controller实例,你可以查询它的当前状态,控制器可以有不同的组件:

  1. 按钮: 这包括您通常使用额X,Y按钮以及某些控制器上的D-PAD,按钮可以按下一些释放。
  2. 轴:通常由模拟棒提供,值在1和-1之间。
  3. POV(又名帽子开关):提供离散的定向状态,例如 北,东,西,东南等。
  4. 滑块和加速度计:这些都在API中,但目前未经测试。
    一个经典的控制器示例是XBox 360控制器:
XBox 360控制器

It has a left and a right analogue stick, each with an x- and a y-axis, triggers on the back, each representing a single axis and various buttons and a d-pad, which might either be reported as buttons or as axes.

轮询特定组件的状态非常简单:

boolean buttonPressed = controller.getButton(buttonCode);
float axisValue = controller.getAxis(axisCode);
...

每个组件都有自己的代码(类似于keyboad键的键代码或扫描代码)。 该代码是控制器特定的,例如 XBox控制器上的X按钮可能具有与PS3控制器上的X按钮不同的代码。 稍后我们再回到这个问题。

基于事件的控制器输入

当轮询控制器时,可能会丢失一些输入事件。 对于某些任务,基于事件的输入也比基于轮询的输入更合适。 因此,我们为您提供一种注册监听器来接收控制器事件的方式,您必须实现监听控制器事件的接口称为ControllerListener:

public interface ControllerListener {
    public void connected(Controller controller);
    public void disconnected(Controller controller);
    public boolean buttonDown (Controller controller, int buttonCode);
    public boolean buttonUp (Controller controller, int buttonCode);
    public boolean axisMoved (Controller controller, int axisCode, float value);
    public boolean povMoved (Controller controller, int povCode, PovDirection value);
    public boolean xSliderMoved (Controller controller, int sliderCode, boolean value);
    public boolean ySliderMoved (Controller controller, int sliderCode, boolean value);
    public boolean accelerometerMoved (Controller controller, int accelerometerCode, Vector3 value);
}

前两个方法主要是控制器在连接或者断开连接时会调用。
接下来的两个方法报告按钮被按下或释放的事件。
当轴值发生更改时,调用axisMoved()方法。以此类推.

ControllerListener可以被添加到控制器,在这种情况下,它将监听来自所有控制器的事件,也可以侦听特定的控制器,在这种情况下,它只会从该控制器接收事件:

Controllers.addListener(listener); // receives events from all controllers
controller.addListener(listener); // receives events only from this controller

如果你不想实现所有这些方法,而只是关心其中少数的几个方法,你可以继承ControllerAdapter:

controller.addListener(new ControllerAdapter() {
   @Override
   public void connected(Controller controller) {
      ...
   }
 
   public void disconnected(Controller controller) {
      ...
   }
};

您可能已经注意到一些侦听器方法返回一个布尔值。 如果在全局或者特定的控制器注册了多个监听器,则会使用此选项,如果这样的方法返回false,那么事件将被传递给下一个监听器。 如果该方法返回true,则该事件将不再传播。

所有侦听器方法都将在渲染线程上被调用,就像普通的InputProcessor一样。

映射和代码

如上所述,不同的组件具有不同的代码。 这些代码没有标准化,所以我们在处理控制器时有两个选择:

  1. 硬编码特定控制器的代码,例如 Ouya控制器
  2. 让玩家配置控制器绑定,例如 运行每个动作,并要求玩家按相应的控制器组件(按钮,轴,POV等)。

我们目前拥有Ouya控制器按钮和轴的代码。 要检查控制器是否是Ouya控制器,可以这样做:

if(controller.getName().equals(Ouya.ID)) {
   // we know it's an Ouya controller, so we can use the Ouya codes
   float leftXAxis = controller.getAxis(Ouya.AXIS_LEFT_X);
   boolean oButton = controller.getButton(Ouya.BUTTON_O);
}

您还可以检查您是否正在Ouya设备上运行:

if(Ouya.runningOnOuya) {
   // DO SOMETHING!
}

您也可以将Ouya控制器与普通Android设备配对,这就是为什么要判断是否在Ouya设备上运行的原因。
我们将来会为流行的控制器添加更多的映射,例如 Xbox 360和PS3控制器。
请注意,根据操作系统,这些代码对于同一类型的控制器可能不同。 我的便宜的Logitech控制器在Windows上为x轴指定了代码0,在Linux和Mac OS X上获得了代码1。你可以在com.badlogic.gdx.controllers.mappings包中找到对应的映射和代码,如上面的Ouya类, 我们将确保代码适用于所有操作系统。

最后,最好让用户决定如何使用她的手柄。 编写一个简单的配置对话框,通过操作运行,并要求用户按下一个按钮很容易做到。 然后您可以将这些映射与控制器名称一起保存到文件中并重新加载这些配置项。

控制器连接与断开

目前在桌面和Android上都报告了控制器的连接与断开。 如果您的游戏支持游戏手柄,请确保处理设备断开与连接! 例如如果控制器在游戏过程中断开连接,则暂停游戏,并要求用户重新连接控制器。 请注意,在这种情况下,您将获得一个全新的Controller实例,因此请确保正确连接任何监听器。 旧的控制器实例将被报告为断开连接。

融入您的项目

在gdx-setup app中勾选Controllers选项,对于LWJGL 3,替换gdx-controllers-desktop依赖 更改为:gdx-controllers-lwjgl3,在桌面应用中,移除compile "com.badlogicgames.gdx:gdx-controllers-platform:$gdxVersion:natives-desktop" 依赖.

Tests & Demos

我写了一个新的小测试,可以显示当前连接的控制器和事件数据,称为ControllersTest。 我还增加了gdx-invaders 演示来支持Ouya控制器。 请注意,该Demo不会处理断开连接或提供任何配置选项。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,618评论 4 59
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,517评论 6 13
  • --------少年时,我曾两次乘列车经过兰州,但他对于我,仅仅是凄冷夜风中摇曳的一块站牌,是迷离灯火中死寂的一座...
    任艾军阅读 121评论 0 2
  • 本文有大招,APP内存占用从175M优化到97M,使用GIMP查看大内存图片。然后针对性优化。我相信大家对Memo...
    ijustyce阅读 367评论 0 4
  • 启动源码详解 通过上面的二篇文章,我相信您对tcc应该有个大体的了解,并且已经搭建好了调试环境,那么就让我们一起探...
    dromara阅读 959评论 0 1