A tela da televisão apresenta uma série de considerações que podem ser novas no jogo para dispositivos móveis desenvolvedores de aplicativos. Essas áreas incluem seu tamanho grande, seu esquema de controles e o fato de que todos os jogadores os visualizam ao mesmo tempo.
Tela
Os dois fatores mais importantes a serem considerados ao desenvolver jogos para a tela da TV é projetar seu jogo para a orientação paisagem e oferecer suporte a baixa latência.
Compatibilidade com a exibição paisagem
A TV está sempre na horizontal. Ela não pode ser virada e não há orientação retrato. Sempre projete seus jogos para TV para exibição em modo paisagem.
Modo de baixa latência automático
Alguns monitores podem realizar pós-processamento gráfico. Esse pós-processamento melhora a qualidade dos gráficos, mas pode aumentar a latência. Telas mais recentes compatíveis com HDMI 2.1 têm um baixo automático o modo de latência (ALLM), que minimiza a latência desativando esse pós-processamento. Para mais detalhes sobre o ALLM, consulte a especificação HDMI 2.1. Outras telas podem oferecer suporte a um modo de jogo com comportamento semelhante.
No Android 11 e versões mais recentes, uma janela pode solicitar que o modo de baixa latência ou o jogo ser usado, se disponível, solicitando um pós-processamento mínimo. Isso é particularmente útil para aplicativos de jogos e videoconferências, em que a baixa latência é mais importante que ter os melhores gráficos possíveis.
Para ativar ou desativar o pós-processamento mínimo, chame
Window.setPreferMinimalPostProcessing()
ou defina o atributo
preferMinimalPostProcessing
da janela como true
. Nem todas as telas dão suporte ao pós-processamento mínimo. para descobrir se
tela específica não é compatível, chame o método
Display.isMinimalPostProcessingSupported()
.
Dispositivos de entrada
TVs não têm interfaces de toque, então é ainda mais importante ter os controles corretos de garantir que os jogadores os considerem fáceis e divertidos de usar. Gerenciar controladores também apresenta alguns outros problemas a serem observados, como manter o controle de vários controladores e o processamento de desconexões normalmente. Todos os apps de TV, incluindo jogos, precisam lidar com controles de forma consistente. Leia Gerenciar TV controladores para mais informações sobre o uso de controles de TV e Use controles para jogos para fins específicos informações sobre o uso de controles de TV para jogos.
Layouts de teclado
No Android 13 (nível 33 da API) e versões mais recentes, é possível determinar layouts de teclado usando
getKeyCodeForKeyLocation()
:
Por exemplo, seu jogo oferece suporte a movimentos usando as teclas WASD, mas isso pode não funcionar corretamente em
um teclado AZERTY que tem as teclas A e W em diferentes locais. Você pode receber os keycodes
das teclas esperadas em determinadas posições:
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); }
Neste exemplo, com um teclado AZERTY, keyUp
é definido como
KeyEvent.KEYCODE_Z
, keyLeft
é definido como KeyEvent.KEYCODE_Q
,
enquanto keyDown
e keyRight
são definidos como KeyEvent.KEYCODE_S
e KeyEvent.KEYCODE_D
, respectivamente. Agora é possível criar manipuladores de eventos principais para esses
códigos de chave e implementar o comportamento esperado.
Manifesto
Os jogos devem incluir alguns itens especiais no manifesto do Android.
Mostrar o jogo na tela inicial
A tela inicial da Android TV exibe jogos em uma fila separada dos outros apps.
Para que seu jogo apareça na lista de jogos, defina o
atributo
android:isGame
como "true"
na tag
<application>
do manifesto do app. Exemplo:
<application ... android:isGame="true" ... >
Declarar compatibilidade para controles de jogos
Controles de jogos podem não estar disponíveis ou ativos para usuários de um dispositivo de TV. Para responder adequadamente informar aos usuários que seu jogo é compatível com um controle de jogo, você deve incluir a seguinte entrada em manifesto do app:
<uses-feature android:name="android.hardware.gamepad" android:required="false"/>
Observação: ao especificar a compatibilidade com android:hardware:gamepad
, não defina o
atributo android:required
como "true"
. Se você fizer isso, os usuários não poderão
instalar o app em dispositivos de TV.
Para mais informações sobre entradas do manifesto, consulte Manifesto do app.
Serviços relacionados a jogos do Google Play
Se o jogo integrar os Serviços relacionados a jogos do Google Play, será preciso levar em conta diversos fatores relacionados a conquistas, login e salvamento de jogos.
Conquistas
Seu jogo deve incluir pelo menos cinco conquistas (que podem ser atingidas). Somente o usuário que controla a jogabilidade em um dispositivo de entrada compatível pode ganhar conquistas. Para mais informações sobre conquistas e como implementá-las, consulte Conquistas no Android.
Login
Seu jogo precisa tentar fazer o login do usuário durante a inicialização. Se o jogador recusar o login várias vezes seguidas, o jogo deverá parar de pedir. Saiba mais sobre o login em Como implementar o login em Android.
Salvando
Use os Jogos salvos do Google Play Services para armazenar o salvamento de jogos. Seu jogo deve vincular o conteúdo salvo a uma Conta do Google específica para que seja claramente identificável em vários dispositivos: quer o jogador esteja usando um aparelho ou uma TV, O jogo deve poder extrair as informações de salvamento do jogo da mesma conta de usuário.
Ofereça também uma opção na IU do jogo que permita que o usuário exclua dados locais ou armazenados em nuvem. Você pode colocar a opção na tela Settings
do jogo. Para
detalhes sobre como implementar jogos salvos usando o Google Play Services, consulte Jogos salvos no Android.
Sair
Ofereça um elemento de IU consistente e fácil de encontrar que permita que o usuário saia do jogo. Esse elemento precisa ser acessível com os botões de navegação do botão direcional. Não use o botão home como saída, uma vez que ele não é consistente nem confiável em controles diferentes.
Web
Não ative a navegação na Web em jogos para o Android TV. O Android TV não é compatível com navegadores da Web.
Observação: você pode usar a classe WebView
para fazer login em
serviços de mídia social.
Redes
Em geral, os jogos precisam de uma largura de banda maior para proporcionar um desempenho ideal. Além disso, muitos usuários preferem a Ethernet ao Wi-Fi para atingir esse desempenho. O app precisa verificar a existência de ambas as conexões. Caso seu app seja destinado apenas à TV, não é necessário procurar o serviço 3G/LTE como você faria para um aplicativo móvel.