A tela da TV apresenta várias considerações que podem ser novas para desenvolvedores de jogos para dispositivos móveis. Essas áreas incluem o tamanho grande, o esquema de controle e o fato de que todos os jogadores estão assistindo simultaneamente.
Display
As duas principais coisas a serem consideradas ao desenvolver jogos para a tela da TV são projetar o jogo para uma orientação paisagem e oferecer suporte à baixa latência.
Compatibilidade com a exibição paisagem
Uma TV está sempre de lado: não é possível girá-la, e não há orientação retrato. Sempre projete seus jogos para TV para serem exibidos no modo paisagem.
Modo de baixa latência automático
Alguns displays podem realizar pós-processamento de gráficos. Esse pós-processamento melhora a qualidade dos gráficos mas pode aumentar a latência. Os displays mais recentes que oferecem suporte a HDMI 2.1 têm um modo de baixa latência automático (ALLM), que minimiza a latência desativando esse pós-processamento. Para mais detalhes sobre o ALLM, consulte a especificação HDMI 2.1. Outros displays 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 automático ou o modo de jogo seja usado, se disponível, solicitando o pós-processamento mínimo. Isso é particularmente útil para aplicativos de jogos e videoconferências, em que a baixa latência é mais importante do 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 todos os displays oferecem suporte ao pós-processamento mínimo. Para saber se um
display específico oferece suporte a ele, chame o
Display.isMinimalPostProcessingSupported() método.
Dispositivos de entrada
As TVs não têm interfaces de toque, então é ainda mais importante acertar os controles e garantir que os jogadores os considerem intuitivos e divertidos de usar. O processamento de controles também apresenta outros problemas a serem considerados, como o controle de vários controles e o tratamento adequado de desconexões. Todos os apps de TV, incluindo jogos, precisam processar os controles de forma consistente. Leia Gerenciar controles de TVpara mais informações sobre como usar controles de TV e Processar controles para jogos para informações específicas sobre como usar 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 locais diferentes. É possível receber os códigos de tecla
para as 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 para esses códigos de tecla 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 o jogo apareça na lista de jogos, defina o
android:isGame atributo 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 informar corretamente aos usuários que o jogo oferece suporte a um controle de jogos, inclua a seguinte entrada no manifesto do app:
<uses-feature android:name="android.hardware.gamepad" android:required="false"/>
Observação: ao especificar o android.hardware.gamepad
suporte, defina o android:required atributo como
"false" se o jogo também puder ser jogado com um controle remoto de TV
padrão (botão direcional). Defina android:required como
"true" somente se um controle de jogos for necessário para jogar.
A definição de android:required="true" mostra um selo "Controle de jogos necessário"
e um aviso de pré-instalação no Google Play para Android TV, em vez de
bloquear a instalação em dispositivos de TV.
Para mais informações sobre entradas de 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, considere algumas considerações sobre conquistas, login e salvamento de jogos.
Conquistas
Seu jogo deve incluir pelo menos cinco conquistas (que podem ser atingidas). Somente um usuário que controla a jogabilidade de 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 vai parar de perguntar. Saiba mais sobre o login em Implementar o login no Android.
Salvando
Use os Jogos salvos do Google Play Services para armazenar o jogo salvo. O jogo precisa vincular os jogos salvos a uma Conta do Google específica para ser identificado de maneira exclusiva, mesmo em dispositivos diferentes: seja o jogador usando um smartphone ou uma TV, o jogo precisa ser capaz de extrair as informações de salvamento do jogo da mesma conta de usuário.
Você também precisa oferecer uma opção na interface do jogo para permitir que o jogador exclua dados armazenados localmente e
na nuvem. Você pode colocar a opção na tela Settings do jogo. Para detalhes sobre a implementação de jogos salvos usando o Google Play Services, consulte Jogos salvos no Android.
Sair
Ofereça um elemento da interface 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. Faça isso em vez de usar o botão Home para sair, porque ele não é consistente nem confiável em diferentes controles.
Web
Não ative a navegação na Web em jogos para Android TV. O Android TV não oferece suporte a um navegador da Web.
Observação: é possível usar a classe WebView para logins em
serviços de rede social.
Rede
Os jogos geralmente precisam de mais largura de banda para oferecer desempenho ideal, e muitos usuários preferem Ethernet a Wi-Fi para oferecer esse desempenho. O app precisa verificar as conexões Wi-Fi e Ethernet. Se o app for apenas para TV, não é necessário verificar o serviço 3G/LTE como faria para um app para dispositivos móveis.