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

虽然大多数游戏旨在支持每个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<Ship> mShips = new SparseArray<Ship>();

@Override
public void onInputDeviceAdded(int deviceId) {
    getShipForID(deviceId);
}

@Override
public 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相对应的玩家头像参考,并根据用户在该控制器上的按钮更新游戏。

@Override
public 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
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

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

猜你喜欢

转载自blog.51cto.com/4789781/2125395
今日推荐