Crea giochi per la TV

Lo schermo televisivo presenta una serie di considerazioni che potrebbero essere nuove per gli sviluppatori di giochi per dispositivi mobili. Queste aree includono le grandi dimensioni, lo schema di controllo e il fatto che tutti i giocatori lo visualizzano contemporaneamente.

Display

Le due cose principali da tenere a mente quando sviluppi giochi per lo schermo TV sono la progettazione del tuo gioco per l'orientamento orizzontale e il supporto per la bassa latenza.

Supporta la visualizzazione orizzontale

Una TV è sempre orizzontale: non puoi ruotarla e non esiste l'orientamento verticale. Progetta sempre i giochi per TV in modo che vengano visualizzati in modalità Orizzontale.

Modalità a bassa latenza automatica

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

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

Per attivare o disattivare la post-elaborazione minima, 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 Display.isMinimalPostProcessingSupported() metodo.

Dispositivi di immissione

Le TV non hanno interfacce touch, quindi è ancora più importante configurare correttamente i controlli e assicurarsi 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 corretta delle disconnessioni. Tutte le app TV, inclusi i giochi, devono gestire i controller in modo coerente. Per ulteriori informazioni sull'utilizzo dei controller TV, consulta Gestire i controller TV e per informazioni specifiche sull'utilizzo dei controller TV per i giochi, consulta Gestire i controller per i giochi.

Layout tastiera

In Android 13 (livello API 33) e versioni successive, puoi determinare i layout della tastiera utilizzando getKeyCodeForKeyLocation(). Ad esempio, il tuo gioco supporta il movimento utilizzando 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 i tasti che ti aspetti 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

Esistono alcune cose speciali che i giochi devono includere nel file manifest Android.

Mostra il tuo gioco nella schermata Home

La schermata Home di Android TV mostra i giochi in una riga separata dalle app normali. Per visualizzare il tuo gioco nell'elenco dei giochi, imposta l' android:isGame attributo su "true" nel tag <application> del file manifest dell'app. Ad esempio:

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

Dichiara il supporto dei controller di gioco

I controller di gioco 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 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 del file 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 deve essere in grado di ottenere obiettivi. Per ulteriori informazioni sugli obiettivi e su come implementarli, consulta Obiettivi in Android.

Accedi

Il tuo gioco deve tentare di accedere all'utente all'avvio. Se il giocatore rifiuta l'accesso più volte di seguito, il gioco deve smettere di chiedere. Scopri di più sull'accesso in Implementare l'accesso su Android.

Salvataggio in corso…

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

Devi anche fornire un'opzione nell'interfaccia utente del gioco per consentire al giocatore di eliminare i dati archiviati localmente e nel cloud. Puoi inserire l'opzione nella schermata Settings del gioco. Per informazioni specifiche sull'implementazione delle partite salvate utilizzando Play Services, consulta Partite salvate in Android.

Esci

Fornisci un elemento dell'interfaccia utente coerente e ovvio che consenta all'utente di uscire dal gioco in modo corretto. Questo elemento deve essere accessibile con i pulsanti di navigazione del D-pad. Esegui questa operazione anziché fare affidamento sul pulsante Home per fornire un'uscita, poiché 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 spesso richiedono una larghezza di banda maggiore per fornire prestazioni ottimali e molti utenti preferiscono Ethernet al Wi-Fi per fornire queste prestazioni. La tua app deve verificare sia le connessioni Wi-Fi sia quelle Ethernet. Se la tua app è solo per TV, non devi verificare il servizio 3G/LTE come faresti per un'app mobile.