博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Touch&input 】支持多个游戏控制器(18)
阅读量:5850 次
发布时间:2019-06-19

本文共 2135 字,大约阅读时间需要 7 分钟。

虽然大多数游戏旨在支持每个Android设备上的单个用户,但也可以通过同一Android设备上同时连接的游戏控制器支持多个用户。

本课介绍一些基本技巧,用于处理来自多个连接的控制器的单个设备多人游戏中的输入。这包括维护玩家头像和每个控制器设备之间的映射并适当地处理控制器输入事件。

将玩家映射到控制器设备ID


当游戏控制器连接到Android设备时,系统会为其分配一个整数设备ID。您可以通过调用获取已连接游戏控制器的设备ID InputDevice.getDeviceIds(),如验证游戏控制器已连接。然后,您可以将每个设备ID与游戏中的玩家相关联,并分别处理每个玩家的游戏操作。

注意:在运行Android 4.1(API级别16)及更高版本的设备上,您可以使用获取输入设备的描述符getDescriptor(),该描述符为输入设备 返回唯一的持久字符串值。与设备ID不同,即使输入设备断开连接,重新连接或重新配置,描述符值也不会改变。

下面的代码片段展示了如何使用a SparseArray 将玩家的头像与特定的控制器相关联。在这个例子中, mShips变量存储一个Ship对象集合。新玩家头像是在用户附加新控制器时在游戏中创建的,并且在移除关联控制器时将其移除。

的onInputDeviceAdded()和onInputDeviceRemoved()回调方法在引入的抽象层的一部分 支持控制器在Android版本。通过实现这些侦听器回调,您的游戏可以在添加或删除控制器时识别游戏控制器的设备ID。此检测与Android 2.3(API级别9)及更高版本兼容。

private final SparseArray
mShips = new SparseArray
();@Overridepublic void onInputDeviceAdded(int deviceId) { getShipForID(deviceId);}@Overridepublic void onInputDeviceRemoved(int deviceId) { removeShipForID(deviceId);}private Ship getShipForID(int shipID) { Ship currentShip = mShips.get(shipID); if ( null == currentShip ) { currentShip = new Ship(); mShips.append(shipID, currentShip); } return currentShip;}private void removeShipForID(int shipID) { mShips.remove(shipID);}

处理多个控制器输入


你的游戏应该执行下面的循环来处理来自多个控制器的输入:

  1. 检测是否发生输入事件。
  2. 识别输入源及其设备ID。
  3. 根据输入事件键代码或轴值指示的操作,更新与该设备ID关联的玩家头像。
  4. 呈现和更新用户界面。

KeyEvent并且MotionEvent输入事件具有与它们相关联的设备ID。您的游戏可以利用此优势来确定输入事件来自哪个控制器,并更新与该控制器关联的玩家头像。

以下代码片段显示了如何获取与游戏控制器设备ID相对应的玩家头像参考,并根据用户在该控制器上的按钮更新游戏。

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    if ((event.getSource() & InputDevice.SOURCE_GAMEPAD)                == InputDevice.SOURCE_GAMEPAD) {        int deviceId = event.getDeviceId();        if (deviceId != -1) {            Ship currentShip = getShipForId(deviceId);            // Based on which key was pressed, update the player avatar            // (e.g. set the ship headings or fire lasers)            ...            return true;        }    }    return super.onKeyDown(keyCode, event);}

注意:最佳做法是,当用户的游戏控制器断开连接时,应暂停游戏并询问用户是否要重新连接。

Lastest Update:2018.04.23

联系我

QQ:94297366

微信打赏:

公众号推荐:

【Touch&input 】支持多个游戏控制器(18)

转载于:https://blog.51cto.com/4789781/2125395

你可能感兴趣的文章
Scott Guthrie访谈:定制仪表板与Azure Monitor
查看>>
Microsoft Quantum Katas帮助开发人员探索使用Q#实现量子计算
查看>>
Spark背后公司Databricks获2.5亿融资,估值27.5亿美元
查看>>
Akka actor tell, ask 函数的实现
查看>>
NodeJS的底层通信
查看>>
windows10 chrome 调试 ios safari 方法
查看>>
Java 免费!亚马逊开源 Java SE 发行版的直接替代品 Corretto
查看>>
Hello , Ruby!
查看>>
navigator 应用
查看>>
Netty 4.1.35.Final 发布,经典开源 Java 网络服务框架
查看>>
详解Microsoft.AspNetCore.CookiePolicy
查看>>
go与c互相调用
查看>>
如何优雅地用Redis实现分布式锁
查看>>
程序员的4条忠告,你做到了几条
查看>>
从零开始Docker化你的Node.js应用
查看>>
mybatis模糊查询
查看>>
你真的需要活动目录吗?
查看>>
Linux 新增一块硬盘,添加到已有逻辑卷
查看>>
【Linux系统】模拟MBR扇区故障与恢复 (转)
查看>>
简单mdadm操作实例
查看>>