Der Fernsehbildschirm stellt Entwickler von mobilen Spielen vor einige Herausforderungen, die sie vielleicht noch nicht kennen. Dazu gehören die große Größe, die Steuerung und die Tatsache, dass sich alle Spieler das Spiel gleichzeitig ansehen.
Anzeige
Die beiden wichtigsten Dinge, die Sie bei der Entwicklung von Spielen für den Fernsehbildschirm beachten sollten, sind die Ausrichtung des Spiels im Querformat und die Unterstützung einer niedrigen Latenz.
Unterstützung von Displays im Querformat
Ein Fernseher ist immer querformatig: Er kann nicht gedreht werden und es gibt keine Hochformat-Ausrichtung. Optimieren Sie Ihre Fernsehspiele immer für die Darstellung im Querformat.
Automatischer Modus für geringe Latenzzeit
Bestimmte Displays können eine Grafik-Nachbearbeitung durchführen. Diese Nachbearbeitung verbessert die Grafikqualität, kann aber die Latenz erhöhen. Neuere Displays, die HDMI 2.1 unterstützen, haben einen automatischen Modus mit niedriger Latenz (ALLM), der die Latenz minimiert, indem diese Nachbearbeitung deaktiviert wird. Weitere Informationen zu ALLM finden Sie in der HDMI 2.1-Spezifikation. Andere Displays unterstützen möglicherweise einen Spielmodus mit ähnlichem Verhalten.
Unter Android 11 und höher kann ein Fenster die Verwendung des automatischen Modus mit niedriger Latenz oder des Spielmodus anfordern, sofern verfügbar, indem minimale Nachbearbeitung angefordert wird. Das ist besonders für Spiele- und Videokonferenzanwendungen nützlich, bei denen eine niedrige Latenz wichtiger ist als die bestmögliche Grafik.
Wenn Sie die minimale Nachbearbeitung aktivieren oder deaktivieren möchten, rufen Sie Window.setPreferMinimalPostProcessing()
auf oder legen Sie das preferMinimalPostProcessing
-Attribut des Fensters auf true
fest. Nicht alle Displays unterstützen die minimale Nachbearbeitung. Wenn Sie herausfinden möchten, ob ein bestimmtes Display sie unterstützt, rufen Sie die Methode Display.isMinimalPostProcessingSupported()
auf.
Eingabegeräte
Fernseher haben keine Touchbedienung. Daher ist es umso wichtiger, die Steuerelemente richtig zu gestalten und dafür zu sorgen, dass sie für die Spieler intuitiv und unterhaltsam sind. Bei der Verarbeitung von Controllern müssen auch einige andere Probleme beachtet werden, z. B. die Verwaltung mehrerer Controller und die reibungslose Verarbeitung von Unterbrechungen. Alle TV-Apps, einschließlich Spiele, sollten Controller einheitlich verarbeiten. Weitere Informationen zur Verwendung von Fernseher-Controllern findest du unter Fernseher-Controller verwalten. Unter Umgang mit Controllern für Spiele findest du spezielle Informationen zur Verwendung von Fernseher-Controllern für Spiele.
Tastaturlayouts
Unter Android 13 (API-Level 33) und höher können Sie Tastaturlayouts mit getKeyCodeForKeyLocation()
festlegen.
Angenommen, Ihr Spiel unterstützt die Bewegung mit den WASD-Tasten. Dies funktioniert jedoch möglicherweise nicht richtig auf einer AZERTY-Tastatur, auf der die Tasten A und W an unterschiedlichen Stellen sind. Sie können die Tastencodes für die Tasten abrufen, die an bestimmten Positionen erwartet werden:
Kotlin
val inputManager: InputManager? = requireActivity().getSystemService() inputManager?.inputDeviceIds?.map { inputManager.getInputDevice(it) } ?.firstOrNull { it.keyboardType == InputDevice.KEYBOARD_TYPE_ALPHABETIC } ?.let { inputDevice -> keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W) keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A) keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S) keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D) }
Java
InputManager inputManager = requireActivity().getSystemService(InputManager.class); InputDevice inputDevice = Arrays.stream(inputManager.getInputDeviceIds()) .mapToObj(inputManager::getInputDevice) .filter( device -> device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) .filter(Objects::nonNull) .findFirst() .orElse(null); if (inputDevice != null) { keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W); keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A); keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S); keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D); }
In diesem Beispiel ist bei einer AZERTY-Tastatur keyUp
auf KeyEvent.KEYCODE_Z
, keyLeft
auf KeyEvent.KEYCODE_Q
, keyDown
auf KeyEvent.KEYCODE_S
und keyRight
auf KeyEvent.KEYCODE_D
festgelegt. Sie können jetzt Schlüsselereignis-Handler für diese Schlüsselcodes erstellen und das erwartete Verhalten implementieren.
Manifest
Für Spiele gibt es einige spezielle Dinge, die im Android-Manifest enthalten sein sollten.
Spiel auf dem Startbildschirm präsentieren
Im Startbildschirm von Android TV werden Spiele in einer anderen Zeile als reguläre Apps präsentiert.
Damit Ihr Spiel in der Liste der Spiele angezeigt wird, müssen Sie das Attribut
android:isGame
im Tag <application>
Ihres App-Manifests auf "true"
festlegen. Beispiel:
<application ... android:isGame="true" ... >
Unterstützung für Gamecontroller deklarieren
Gamecontroller sind für Nutzer von Fernsehern möglicherweise nicht verfügbar oder aktiv. Damit Nutzer richtig informiert werden, dass Ihr Spiel einen Gamecontroller unterstützt, müssen Sie den folgenden Eintrag in Ihr App-Manifest aufnehmen:
<uses-feature android:name="android.hardware.gamepad" android:required="false"/>
Hinweis:Wenn Sie die Unterstützung von android:hardware:gamepad
angeben, dürfen Sie das Attribut android:required
nicht auf "true"
festlegen. In diesem Fall können Nutzer Ihre App nicht auf Fernsehern installieren.
Weitere Informationen zu Manifesteinträgen finden Sie unter App-Manifest.
Google Play-Spieldienste
Wenn Sie in Ihrem Spiel Google Play-Spieldienste einbinden, sollten Sie einige Aspekte im Hinblick auf Erfolge, Anmeldung und Speichern von Spielen beachten.
Erfolge
Ihr Spiel sollte mindestens fünf (erzielbare) Erfolge enthalten. Nur ein Nutzer, der das Gameplay über ein unterstütztes Eingabegerät steuert, sollte in der Lage sein, Erfolge zu erzielen. Weitere Informationen zu Erfolgen und ihrer Implementierung finden Sie unter Erfolge unter Android.
Anmelden
Ihr Spiel sollte versuchen, den Nutzer beim Start anzumelden. Wenn der Spieler die Anmeldung mehrmals hintereinander ablehnt, sollte Ihr Spiel nicht mehr danach fragen. Weitere Informationen zur Anmeldung finden Sie unter Anmeldung unter Android implementieren.
Wird gespeichert
Verwenden Sie die Gespeicherten Spiele von Google Play-Diensten, um Ihren Spielstand zu speichern. Ihr Spiel sollte Spielstände an ein bestimmtes Google-Konto binden, damit sie auch geräteübergreifend eindeutig identifizierbar sind: Unabhängig davon, ob der Spieler ein Smartphone oder einen Fernseher verwendet, sollte das Spiel die Informationen zum Spielstand aus demselben Nutzerkonto abrufen können.
Sie sollten in der Benutzeroberfläche Ihres Spiels auch eine Option anbieten, mit der Spieler lokal und in der Cloud gespeicherte Daten löschen können. Sie können die Option auf dem Bildschirm Settings
des Spiels platzieren. Weitere Informationen zur Implementierung von gespeicherten Spielen mit Play-Diensten finden Sie unter Gespeicherte Spiele unter Android.
Beenden
Bieten Sie ein einheitliches und eindeutiges UI-Element, mit dem Nutzer das Spiel ordnungsgemäß beenden können. Dieses Element sollte über die Navigationstasten des D-Pads zugänglich sein. Verwenden Sie diese Option, anstatt die Schaltfläche „Startseite“ als Ausstiegsoption zu verwenden, da dies nicht einheitlich und nicht zuverlässig auf verschiedenen Controllern funktioniert.
Web
Aktivieren Sie das Surfen im Web in Spielen für Android TV nicht. Android TV unterstützt keinen Webbrowser.
Hinweis:Sie können die Klasse WebView
für Anmeldungen in sozialen Medien verwenden.
Netzwerke
Spiele benötigen häufig eine größere Bandbreite, um eine optimale Leistung zu erzielen. Viele Nutzer bevorzugen Ethernet gegenüber WLAN, um diese Leistung zu erzielen. Ihre App sollte sowohl nach WLAN- als auch nach Ethernetverbindungen suchen. Wenn Ihre App nur für Fernseher gedacht ist, müssen Sie nicht wie bei einer mobilen App prüfen, ob 3G/LTE verfügbar ist.