Crea giochi per la TV

Lo schermo della TV presenta una serie di aspetti che potrebbero essere nuovi per gli sviluppatori di giochi per dispositivi mobili. Tra queste aree rientrano le grandi dimensioni, lo schema di controllo e il fatto che tutti i soggetti lo stanno visualizzando contemporaneamente.

Display

Le due cose principali da tenere a mente durante lo sviluppo di giochi per lo schermo TV sono la progettazione per un orientamento orizzontale e supportare una bassa latenza.

Assistenza per la visualizzazione orizzontale

Una TV è sempre ruotata: non può essere ruotata e l'orientamento verticale è assente. Progetta sempre i giochi per TV in modo che vengano visualizzati in modalità Orizzontale.

Modalità automatica a bassa latenza

Alcuni display possono eseguire la post-elaborazione della grafica. Questa post-elaborazione migliora la qualità delle immagini, ma può aumentare la latenza. I display più recenti che supportano la tecnologia HDMI 2.1 dispongono della minima automatica modalità di latenza ridotta (ALLM), che riduce al minimo la latenza disattivando questa post-elaborazione. Per maggiori dettagli su ALLM, consulta la specifica HDMI 2.1. Altro i display potrebbero supportare una modalità di gioco con comportamento simile.

In Android 11 e versioni successive, una finestra può richiedere la modalità a bassa latenza automatica o il gioco automatica, se disponibile, richiedendo una post-elaborazione minima. Questo è particolarmente utile per le applicazioni di giochi e videoconferenze, in cui la bassa latenza è più importante dell'avere la grafica migliore possibile.

Per attivare o disattivare il post-processing minimo, chiama Window.setPreferMinimalPostProcessing(), o imposta l'attributo preferMinimalPostProcessing della finestra su true. Non tutti i display supportano la post-elaborazione minima. Per scoprire se un determinato display la supporta, chiama il metodo Display.isMinimalPostProcessingSupported().

Dispositivi di immissione

Le TV non hanno interfacce touch, quindi è ancora più importante scegliere i controlli giusti e assicurarsi che i giocatori li trovino intuitivi e divertenti da usare. La gestione dei controller introduce anche altri problemi da tenere presente, come il monitoraggio di più controller e la gestione delle disconnessioni in modo corretto. Tutte le app TV, inclusi i giochi, devono gestire i controller in modo coerente. Leggi l'articolo Gestire i controller della TV per saperne di più sull'utilizzo dei controller della TV e l'articolo Gestire i controller per i giochi per informazioni specifiche sull'utilizzo dei controller della TV per i giochi.

Layout tastiera

In Android 13 (livello API 33) e versioni successive, puoi determinare i layout di tastiera utilizzando getKeyCodeForKeyLocation(). Ad esempio, il tuo gioco supporta i movimenti utilizzando i tasti WASD, ma questa opzione potrebbe non funzionare correttamente su una tastiera AZERTY con i tasti A e W in posizioni diverse. Puoi ottenere i codici tasti per i tasti che prevedi in determinate posizioni:

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 questo esempio, con una tastiera AZERTY, keyUp è impostato su KeyEvent.KEYCODE_Z, keyLeft è impostato su KeyEvent.KEYCODE_Q, mentre keyDown e keyRight sono impostati su KeyEvent.KEYCODE_S e KeyEvent.KEYCODE_D rispettivamente. Ora puoi creare gestori di eventi chiave per questi codici chiave e implementare il comportamento previsto.

Manifest

Ci sono alcune cose speciali che i giochi dovrebbero includere nel file manifest di Android.

Mostra il gioco nella schermata Home

Nella schermata Home di Android TV le partite sono visualizzate in una riga separata rispetto alle normali app. Per visualizzare il tuo gioco nell'elenco dei giochi, imposta il android:isGame a "true" nel file manifest dell'app <application> il tag. Ad esempio:

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

Dichiarare il supporto dei controller di gioco

I controller di giochi potrebbero non essere disponibili o attivi per gli utenti di un dispositivo TV. Per informare correttamente gli utenti che il tuo gioco supporta un controller di gioco, devi includere la seguente voce nel file manifest dell'app:

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

Nota: quando specifichi il supporto di android:hardware:gamepad, non impostare l'attributo android:required su "true". In questo caso, gli utenti non potranno installare la tua app sui dispositivi TV.

Per ulteriori informazioni sulle voci manifest, consulta File manifest dell'app.

Servizi per i giochi di Google Play

Se il tuo gioco integra i servizi per i giochi di Google Play, devi tenere presente una serie di considerazioni relative a obiettivi, accesso e salvataggio dei giochi.

Obiettivi

Il tuo gioco deve includere almeno cinque obiettivi (ottenibili). Solo un utente che controlla il gameplay da un dispositivo di input supportato dovrebbe essere in grado di ottenere gli obiettivi. Per ulteriori informazioni e su come implementarli, consulta l'articolo Obiettivi in Android.

Accedi

Il gioco dovrebbe tentare di far accedere l'utente al momento del lancio. Se il giocatore rifiuta l'accesso volte di fila, il gioco dovrebbe smettere di chiedere. Per ulteriori informazioni sull'accesso, vedi Implementare l'accesso su Android.

Salvataggio in corso…

Utilizza le partite salvate di Google Play Services per archiviare il tuo salvataggio. Il tuo gioco deve associare i salvataggi di gioco a un Account Google specifico, in modo da identificabile in modo univoco anche su più dispositivi: a prescindere dal fatto che il giocatore utilizzi uno smartphone o una TV, deve essere in grado di recuperare le informazioni sul salvataggio del gioco dallo stesso account utente.

Dovresti anche fornire un'opzione nell'interfaccia utente del gioco per consentire al giocatore di eliminare i contenuti localmente e archiviati nel cloud. Potresti inserire l'opzione nella schermata Settings del gioco. Per specifiche sull'implementazione delle partite salvate tramite Play Services, consulta la sezione Giochi salvati in Android.

Esci

Fornire un elemento UI coerente e evidente che consenta all'utente di uscire dal gioco agevolmente. Questo elemento dovrebbe essere accessibile con i pulsanti di navigazione del D-pad. Esegui questa operazione anziché fare affidamento sul pulsante Home per uscire, in quanto non è coerente né affidabile su diversi controller.

Web

Non attivare la navigazione web nei giochi per Android TV. Android TV non supporta un browser web.

Nota: puoi utilizzare la classe WebView per gli accessi ai servizi di social media.

Reti

I giochi richiedono spesso una maggiore larghezza di banda per offrire prestazioni ottimali e molti utenti preferiscono la connessione ethernet al Wi-Fi per ottenere queste prestazioni. L'app dovrebbe verificare la presenza di connessioni Wi-Fi ed ethernet. Se la tua app è solo per la TV, non è necessario controllare il servizio 3G/LTE come faresti per un'app mobile.