Lo schermo della TV presenta una serie di aspetti che potrebbero essere nuovi per gli sviluppatori di giochi per dispositivi mobili. Queste aree includono le dimensioni, lo schema di controllo e il fatto che tutti i giocatori lo visualizzano contemporaneamente.
Display
I due aspetti principali da tenere in considerazione durante lo sviluppo di giochi per lo schermo della TV sono progettare il gioco per l'orientamento orizzontale e supportare una latenza ridotta.
Supportare la visualizzazione orizzontale
Una TV è sempre in posizione orizzontale: non puoi ruotarla e non è possibile impostare l'orientamento verticale. Progetta sempre i tuoi giochi TV per essere visualizzati in modalità Orizzontale.
Modalità automatica a bassa latenza
Alcuni display possono eseguire il post-trattamento delle immagini. Questa post-elaborazione migliora la qualità delle immagini, ma può aumentare la latenza. I display più recenti che supportano HDMI 2.1 dispongono di una modalità di latenza automatica ridotta (ALLM), che riduce al minimo la latenza disattivando questo post-trattamento. Per maggiori dettagli su 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 un'elaborazione post-produzione 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 della 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 le chiavi 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 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 alcuni elementi speciali che i giochi devono includere nel file Android manifest.
Mostra il gioco nella schermata Home
Nella schermata Home di Android TV, i giochi vengono visualizzati in una riga separata dalle app normali.
Per fare in modo che il tuo gioco venga visualizzato nell'elenco dei giochi, imposta l'attributo
android:isGame
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 per i 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 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 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 sui risultati e su come implementarli, consulta Obiettivi in Android.
Accedi
Il gioco dovrebbe tentare di far accedere l'utente al momento del lancio. Se il giocatore rifiuta di accedere più volte di seguito, il gioco dovrebbe smettere di chiederlo. Per scoprire di più sull'accesso, vedi Implementare l'accesso su Android.
Salvataggio in corso…
Utilizza la funzionalità Partite salvate di Google Play Services per memorizzare la tua partita salvata. Il gioco deve associare i salvataggi a un Account Google specifico, in modo da essere identificabile in modo univoco anche su più dispositivi: che il giocatore utilizzi un cellulare o una TV, il gioco deve essere in grado di recuperare le informazioni sui salvataggi dallo stesso account utente.
Dovresti anche fornire un'opzione nell'interfaccia utente del gioco per consentire al giocatore di eliminare i dati archiviati localmente e sul cloud. Potresti inserire l'opzione nella schermata Settings
del gioco. Per informazioni dettagliate sull'implementazione delle partite salvate utilizzando Play Services, consulta Partite salvate in Android.
Esci
Fornisci un elemento dell'interfaccia utente coerente e ben visibile 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 invece di affidarti al pulsante Home per fornire un'uscita, poiché non è coerente né affidabile tra i 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 offrire prestazioni ottimali e molti utenti preferiscono Ethernet al Wi-Fi per offrire queste prestazioni. L'app dovrebbe verificare la presenza di connessioni Wi-Fi ed ethernet. Se la tua app è solo per TV, non devi verificare la presenza del servizio 3G/LTE come faresti per un'app mobile.