TV-Spiele entwickeln

Der Fernsehbildschirm bietet eine Reihe von Aspekten, die für Entwickler mobiler Spiele möglicherweise neu sind. Zu diesen Bereichen gehören die Größe, das Steuerschema und die Tatsache, dass sie von allen Spielern gleichzeitig angezeigt werden.

Display

Die zwei Hauptaspekte bei der Entwicklung von Spielen für den Fernsehbildschirm sollten Sie darauf achten, dass das Spiel im Querformat ist und niedrige Latenz unterstützt.

Anzeige im Querformat unterstützen

Ein Fernseher ist immer seitlich ausgerichtet: Sie können ihn nicht drehen und haben kein Hochformat. Gestalte deine TV-Spiele immer so, dass sie im Querformat angezeigt werden.

Automatischer Modus mit niedriger Latenz

Bestimmte Bildschirme können eine Grafiknachverarbeitung durchführen. Diese Nachverarbeitung verbessert die Grafikqualität, kann aber die Latenz erhöhen. Neuere Bildschirme, die HDMI 2.1 unterstützen, haben einen automatischen Modus mit niedriger Latenz (ALLM), der die Latenz minimiert, indem diese Nachverarbeitung deaktiviert wird. Weitere Informationen zu ALLM finden Sie in der HDMI 2.1-Spezifikation. Andere Displays unterstützen möglicherweise einen Spielmodus mit einem ähnlichen Verhalten.

Ab Android 11 kann ein Fenster anfordern, dass der automatische Modus mit niedriger Latenz oder der Spielmodus (falls verfügbar) verwendet werden soll, indem eine minimale Nachbearbeitung angefordert wird. Dies ist besonders nützlich für Spiele- und Videokonferenzanwendungen, bei denen eine niedrige Latenz wichtiger ist als eine bestmögliche Grafik.

Um die minimale Nachverarbeitung zu aktivieren oder zu deaktivieren, rufen Sie Window.setPreferMinimalPostProcessing() auf oder setzen Sie das Attribut preferMinimalPostProcessing des Fensters auf true. Nicht alle Bildschirme unterstützen eine minimale Nachverarbeitung. Um herauszufinden, ob eine bestimmte Anzeige dies unterstützt, rufen Sie die Methode Display.isMinimalPostProcessingSupported() auf.

Eingabegeräte

Fernseher haben keine Touchoberfläche. Noch wichtiger ist es also, die richtige Steuerung zu wählen und dafür zu sorgen, dass die Spieler sie intuitiv und unterhaltsam nutzen können. Der Umgang mit Controllern bringt auch einige andere Probleme mit sich, auf die Sie achten sollten, z. B. den Überblick über mehrere Controller und den ordnungsgemäßen Umgang mit Verbindungsabbrüchen. Alle TV-Apps, einschließlich Spiele, sollten Controller einheitlich handhaben. Weitere Informationen zur Verwendung von TV-Controllern findest du unter TV-Controller verwalten. Spezielle Informationen zur Verwendung von TV-Controllern für Spiele findest du unter Controller für Spiele.

Tastaturlayouts

Unter Android 13 (API-Level 33) und höher kannst du Tastaturlayouts mit getKeyCodeForKeyLocation() festlegen. Dein Spiel unterstützt beispielsweise Bewegungen mithilfe der WASD-Tasten, aber dies funktioniert möglicherweise nicht richtig auf einer AZERTY-Tastatur, bei der sich die Tasten A und W an verschiedenen Stellen befinden. Sie können die Schlüsselcodes für die erwarteten Schlüssel an bestimmten Positionen abrufen:

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 und keyDown und keyRight auf KeyEvent.KEYCODE_S bzw. KeyEvent.KEYCODE_D gesetzt. Sie können jetzt Schlüssel-Event-Handler für diese Schlüsselcodes erstellen und das erwartete Verhalten implementieren.

Manifest

Es gibt einige besondere Dinge, die Spiele in das Android-Manifest aufnehmen sollten.

Spiel auf dem Startbildschirm anzeigen lassen

Im Startbildschirm von Android TV werden Spiele in einer anderen Zeile als reguläre Apps präsentiert. Damit dein Spiel in der Liste der Spiele erscheint, setze das Attribut android:isGame im Tag <application> deines App-Manifests auf "true". Beispiele:

<application
    ...
    android:isGame="true"
    ...
>

Unterstützung für Gamecontroller deklarieren

Für Nutzer eines TV-Geräts sind Gamecontroller möglicherweise nicht verfügbar oder nicht aktiv. Damit Nutzer ordnungsgemäß darüber informiert werden, dass dein Spiel einen Gamecontroller unterstützt, musst du den folgenden Eintrag in dein App-Manifest aufnehmen:

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

Hinweis: Wenn Sie die android:hardware:gamepad-Unterstützung angeben, setzen Sie das Attribut android:required nicht auf "true". In diesem Fall können Nutzer deine App nicht auf Fernsehgeräten installieren.

Weitere Informationen zu Manifesteinträgen findest du unter App-Manifest.

Google Play-Spieldienste

Wenn Google Play-Spieldienste in Ihr Spiel integriert sind, sollten Sie eine Reihe von Überlegungen zu Erfolgen, zur Anmeldung und zum Speichern von Spielen beachten.

Erfolge

Ihr Spiel sollte mindestens fünf (erzielbare) Erfolge enthalten. Nur Nutzer, die das Gameplay über ein unterstütztes Eingabegerät steuern, sollten Erfolge erzielen. Weitere Informationen zu Erfolgen und zu ihrer Implementierung findest du unter Erfolge in Android.

Anmelden

Dein Spiel sollte versuchen, den Nutzer beim Start anzumelden. Wenn der Spieler die Anmeldung mehrmals hintereinander ablehnt, sollte das Spiel keine Fragen mehr stellen. Weitere Informationen zur Anmeldung findest du unter Anmeldung unter Android implementieren.

Wird gespeichert

Verwende Gespeicherte Spiele der Google Play-Dienste, um deine gespeicherten Spiele zu speichern. Dein Spiel sollte gespeicherte Spielstände an ein bestimmtes Google-Konto binden, damit es auch geräteübergreifend eindeutig identifiziert werden kann: Unabhängig davon, ob der Spieler ein Mobilgerät oder einen Fernseher verwendet, sollte das Spiel die gespeicherten Informationen vom selben Nutzerkonto abrufen können.

Sie sollten auch eine Option in der Benutzeroberfläche Ihres Spiels anbieten, mit der der Spieler lokal und in der Cloud gespeicherte Daten löschen kann. Du kannst die Option auf dem Settings-Bildschirm des Spiels platzieren. Einzelheiten zur Implementierung gespeicherter Spiele mithilfe der Play-Dienste findest du unter Gespeicherte Spiele in Android.

Beenden

Stellen Sie ein einheitliches und offensichtliches UI-Element bereit, mit dem der Nutzer das Spiel problemlos beenden kann. Dieses Element sollte über die Navigationsschaltflächen des Steuerkreuzes erreichbar sein. Tun Sie dies, anstatt sich auf die Home-Taste zu verlassen, da dies auf verschiedenen Controllern nicht einheitlich oder zuverlässig ist.

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 dafür Ethernet gegenüber WLAN. Die App sollte sowohl WLAN- als auch Ethernetverbindungen prüfen. Wenn Ihre App nur für das Fernsehen vorgesehen ist, müssen Sie nicht wie bei einer mobilen App nach einem 3G/LTE-Dienst suchen.