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:
- Erkennt, ob ein Eingabeereignis aufgetreten ist.
- Bestimme die Eingangsquelle und die zugehörige Geräte-ID.
- 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.
- 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.