Unterstützung für mehrere Gamecontroller

Während die meisten Spiele für einen einzelnen Nutzer pro Android-Gerät konzipiert sind, mehrere Nutzer mit Controllern unterstützen, gleichzeitig mit demselben Android-Gerät verbunden sind.

In dieser Lektion werden einige grundlegende Techniken für den Umgang mit Eingaben in einem einzelnen über mehrere verbundene Controller spielen. Dazu gehören die Zuordnung zwischen den Avataren der Spieler und den einzelnen Controller-Geräten. die Controller-Eingabeereignisse ordnungsgemäß verarbeiten.

Spieler den Controller-Geräte-IDs zuordnen

Wenn ein Gamecontroller mit einem Android-Gerät verbunden ist, weist ihm eine ganzzahlige Geräte-ID zu. Sie können die Geräte-IDs für verbundene Controller durch Aufrufen von InputDevice.getDeviceIds(), wie unter Verbindung eines Gamecontrollers prüfen beschrieben. Anschließend können Sie jedes Geräte-ID mit einem Spieler in Ihrem Spiel ein und verarbeiten Spielaktionen für jeden Spieler separat.

Hinweis : Auf Geräten mit Android 4.1 (API) Level 16) und höher können Sie den Deskriptor eines Eingabegeräts mit getDescriptor() gibt eine eindeutige persistenter Stringwert für das Eingabegerät Im Gegensatz zu einer Geräte-ID kann der Deskriptor ändert sich der Wert nicht, selbst wenn das Eingabegerät getrennt, wieder verbunden oder neu konfiguriert.

Das Code-Snippet unten zeigt, wie ein SparseArray verwendet wird. um den Avatar eines Spielers mit einem bestimmten Controller zu verknüpfen. In diesem Beispiel hat der Parameter Die Variable mShips speichert eine Sammlung von Ship-Objekten. Eine neue Der Spieleravatar wird im Spiel erstellt, wenn ein Nutzer einen neuen Controller anschließt. und entfernt, wenn der zugehörige Verantwortliche entfernt wird.

Der onInputDeviceAdded()- und onInputDeviceRemoved()-Callback -Methoden sind Teil der Abstraktionsschicht, <ph type="x-smartling-placeholder"></ph> Controller in allen Android-Versionen unterstützen. Durch die Implementierung dieser Listener-Rückrufen reagiert, kann Ihr Spiel die Geräte-ID des Controllers erkennen, wenn ein hinzugefügt oder entfernt wird. Diese Erkennung ist mit Android 2.3 kompatibel. (API-Level 9) und höher.

Kotlin

private val ships = SparseArray<Ship>()

override fun onInputDeviceAdded(deviceId: Int) {
    getShipForID(deviceId)
}

override fun onInputDeviceRemoved(deviceId: Int) {
    removeShipForID(deviceId)
}

private fun getShipForID(shipID: Int): Ship {
    return ships.get(shipID) ?: Ship().also {
        ships.append(shipID, it)
    }
}

private fun removeShipForID(shipID: Int) {
    ships.remove(shipID)
}

Java

private final SparseArray<Ship> ships = 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 = ships.get(shipID);
    if ( null == currentShip ) {
        currentShip = new Ship();
        ships.append(shipID, currentShip);
    }
    return currentShip;
}

private void removeShipForID(int shipID) {
    ships.remove(shipID);
}

Eingabe mehrerer Controller verarbeiten

Ihr Spiel sollte die folgende Schleife ausführen, Eingabe von mehreren Controllern:

  1. Erkennt, ob ein Eingabeereignis aufgetreten ist.
  2. Bestimme die Eingangsquelle und die zugehörige Geräte-ID.
  3. Basierend auf der Aktion, die durch den Schlüsselcode oder Achsenwert des Eingabeereignisses angegeben ist, den mit dieser Geräte-ID verknüpften Spieler-Avatar aktualisieren.
  4. Benutzeroberfläche rendern und aktualisieren

Eingabe für KeyEvent und MotionEvent Ereignissen Geräte-IDs zugeordnet sind. Ihr Spiel profitiert von um zu ermitteln, von welchem Controller das Eingabeereignis stammt, und aktualisieren Sie die Avatar des Spielers, der mit diesem Controller verknüpft ist.

Das folgende Code-Snippet zeigt, wie du eine Referenz für einen Spieleravatar abrufen kannst. die einer Controller-Geräte-ID entspricht, und aktualisieren Sie das Spiel die Taste des Nutzers auf diesem Controller gedrückt.

Kotlin

override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
    if (event.source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD) {
        event.deviceId.takeIf { it != -1 }?.also { deviceId ->
            val currentShip: Ship = 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)
}

Java

@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);
}

Hinweis : Wenn die Website eines Nutzers die Verbindung zum Controller getrennt wird, solltest du das Spiel anhalten möchte die Verbindung wiederherstellen.