Crea giochi per la TV

Lo schermo del televisore presenta una serie di considerazioni che potrebbero essere nuove per gli sviluppatori di giochi mobile. ad esempio le grandi dimensioni, lo schema di controllo e il fatto che tutti i player lo stiano visualizzando contemporaneamente.

Display

I due aspetti principali da tenere a mente durante lo sviluppo di giochi per lo schermo della TV sono: progettazione del gioco per un orientamento orizzontale e supporto per la bassa latenza.

Supporto della visualizzazione orizzontale

Una TV è sempre ruotata: non puoi ruotarla e l'orientamento verticale non è disponibile. Progetta sempre i tuoi giochi per la TV per la visualizzazione in modalità Orizzontale.

Modalità automatica a bassa latenza

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 dispongono di una modalità automatica a bassa latenza (ALLM), che riduce al minimo la latenza disattivando questa post-elaborazione. Per maggiori dettagli su ALLM, consulta la specifica HDMI 2.1. Altri display potrebbero supportare una modalità di 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à di gioco, se disponibile, richiedendo una post-elaborazione minima. Ciò è particolarmente utile per le applicazioni di gioco e videoconferenza, in cui la bassa latenza è più importante rispetto alla grafica ottimale.

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 sapere se un determinato display la supporta, chiama il metodo Display.isMinimalPostProcessingSupported().

Dispositivi di immissione

Le TV non hanno un'interfaccia touch, quindi è ancora più importante impostare correttamente i controlli e assicurarti che i giocatori le trovino intuitive e divertenti da usare. La gestione dei controller introduce anche altri problemi a cui prestare attenzione, come il monitoraggio di più controller e una gestione efficiente delle disconnessioni. Tutte le app per TV, inclusi i giochi, dovrebbero gestire i controller in modo coerente. Leggi le sezioni Gestione dei 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 tuo gioco supporta il movimento con i tasti WASD, ma questa operazione potrebbe non funzionare correttamente su una tastiera AZERTY con i tasti A e W in posizioni diverse. Puoi ottenere i codici delle 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 alcuni elementi speciali che i giochi dovrebbero includere nel file manifest Android.

Mostra il tuo gioco nella schermata Home

Nella schermata Home di Android TV i giochi vengono mostrati in una riga separata dalle app normali. Per far comparire 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 per 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". Se esegui questa operazione, gli utenti non potranno installare la tua app sui dispositivi TV.

Per maggiori informazioni sulle voci del manifest, consulta la pagina relativa al 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 gioco deve includere almeno cinque obiettivi (guadagnabili). Solo un utente che controlla il gameplay da un dispositivo di input supportato dovrebbe essere in grado di raggiungere gli obiettivi. Per ulteriori informazioni sugli obiettivi e su come implementarli, consulta la pagina Obiettivi in Android.

Effettuare l'accesso

Il gioco dovrebbe tentare di eseguire l'accesso dell'utente al momento dell'avvio. Se il giocatore rifiuta l'accesso più volte di seguito, il gioco non dovrebbe più chiedere. Scopri di più sull'accesso alla pagina Implementazione dell'accesso su Android.

Salvataggio in corso…

Utilizza Giochi salvati di Google Play Services per memorizzare la partita salvata. Il gioco deve associare i salvataggi a un Account Google specifico, in modo che sia identificabile in modo univoco anche su più dispositivi. Indipendentemente dal fatto che il giocatore utilizzi un telefono o una TV, il gioco deve essere in grado di estrarre le informazioni sulle partite salvate dallo stesso account utente.

Dovresti inoltre fornire un'opzione nell'interfaccia utente del gioco che consenta al giocatore di eliminare i dati archiviati a livello locale e sul cloud. Potresti inserire l'opzione nella schermata Settings del gioco. Per specifiche sull'implementazione delle partite salvate utilizzando Play Services, consulta l'articolo Partite salvate su Android.

Esci

Fornisci un elemento UI coerente e ovvio che consenta all'utente di uscire agevolmente dal gioco. Questo elemento dovrebbe essere accessibile con i pulsanti di navigazione del D-pad. Effettua questa operazione anziché affidarti al pulsante Home per fornire un'uscita, dato che non è coerente né affidabile tra i diversi controller.

Web

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

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

Reti

I giochi hanno spesso bisogno di una larghezza di banda maggiore per offrire prestazioni ottimali e molti utenti preferiscono ethernet al Wi-Fi per offrire queste prestazioni. L'app deve controllare le connessioni Wi-Fi e Ethernet. Se la tua app è solo per la TV, non devi verificare il servizio 3G/LTE come faresti per un'app mobile.