Crea giochi per la TV

Lo schermo del televisore presenta una serie di considerazioni che potrebbero essere una novità per gli sviluppatori di giochi mobile. Tra queste aree rientrano le grandi dimensioni, lo schema di controllo e il fatto che tutti i giocatori lo visualizzino contemporaneamente.

Display

I due aspetti principali da tenere presenti quando si sviluppano giochi per lo schermo TV sono la progettazione del gioco per un orientamento orizzontale e il supporto per la bassa latenza.

Assistenza per la visualizzazione orizzontale

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

Modalità automatica a bassa latenza

Alcuni display possono eseguire la post-elaborazione della grafica. Questa post-elaborazione migliora la qualità della grafica, ma può aumentare la latenza. I display più recenti che supportano HDMI 2.1 dispongono di una modalità automatica a bassa latenza (ALLM), che riduce al minimo la latenza disattivando questa post-elaborazione. Per ulteriori dettagli sull'ALLM, consulta la specifica HDMI 2.1. Altri display potrebbero supportare una modalità di gioco con comportamento simile.

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

Per abilitare o disabilitare la post-elaborazione minima, chiama Window.setPreferMinimalPostProcessing() o imposta l'attributo preferMinimalPostProcessing della finestra su true. Non tutti i display supportano una 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 avere i controlli corretti e fare in modo che i giocatori li trovino intuitivi e divertenti da usare. La gestione dei controller introduce anche altri problemi a cui prestare attenzione, come il monitoraggio di più controller e la gestione agevole della disconnessione. Tutte le app TV, inclusi i giochi, devono gestire i controller in modo coerente. Leggi gli articoli Gestire i controller TV per saperne di più sull'utilizzo dei controller TV e Gestire i controller per i giochi per informazioni specifiche sull'utilizzo dei controller 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 gioco supporta il movimento con i tasti WASD, ma questo potrebbe non funzionare correttamente su una tastiera AZERTY che ha i tasti A e W in posizioni diverse. Puoi ottenere i codici chiave per le chiavi previste 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 rispettivamente su KeyEvent.KEYCODE_S e KeyEvent.KEYCODE_D. 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 i giochi sono visualizzati in una riga separata dalle app normali. Per mostrare il tuo gioco nell'elenco dei giochi, imposta l'attributo android:isGame su "true" nel tag <application> del file manifest dell'app. Ecco alcuni esempi:

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

Dichiara il supporto dei controller di gioco

I controller di giochi potrebbero non essere disponibili o attivi per gli utenti di un dispositivo TV. Per comunicare correttamente agli 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 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 maggiori informazioni sulle voci manifest, vedi File manifest dell'app.

Servizi per i giochi di Google Play

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

Obiettivi

Il gioco deve includere almeno cinque obiettivi (ottenibili). Solo un utente che controlla il gameplay da un dispositivo di input supportato dovrebbe poter ottenere obiettivi. Per ulteriori informazioni sugli obiettivi e su come implementarli, vedi Obiettivi in Android.

Effettuare l'accesso

Il gioco dovrebbe tentare di eseguire l'accesso dell'utente all'avvio. Se il giocatore rifiuta l'accesso più volte di seguito, il gioco dovrebbe smettere di chiedere. Per scoprire di più sull'accesso, vedi Implementare l'accesso su Android.

Salvataggio in corso…

Utilizza Partite salvate di Google Play Services per memorizzare il salvataggio delle partite. Il gioco deve vincolare i salvataggi di gioco a uno specifico Account Google, in modo da essere identificabile in modo univoco anche su più dispositivi: a prescindere dal fatto che il giocatore utilizzi uno smartphone o una TV, il gioco deve essere in grado di estrarre le informazioni sui salvataggi di gioco dallo stesso account utente.

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

Esci

Fornire un elemento UI coerente e evidente che consenta all'utente di uscire dal gioco agevolmente. Questo elemento deve essere accessibile con i pulsanti di navigazione del D-pad. Esegui questa operazione invece di affidarti al pulsante Home per fornire un'uscita, poiché non è coerente né affidabile tra i diversi controller.

Web

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

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

Reti

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