A tela da televisão apresenta uma série de 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 vendo o jogo simultaneamente.
Display
As duas principais coisas que você precisa ter em mente ao desenvolver jogos para a tela da TV são projetar o jogo para uma orientação paisagem e oferecer suporte para baixa latência.
Compatibilidade com a exibição paisagem
Uma TV está sempre na horizontal: não é possível girá-la, e não há orientação retrato. Sempre crie jogos de TV para exibição no modo paisagem.
Modo de baixa latência automática
Algumas telas podem realizar o pós-processamento de gráficos. Esse pós-processamento melhora a qualidade dos gráficos, mas pode aumentar a latência. As telas mais recentes compatíveis com HDMI 2.1 têm um modo de baixa latência automática (ALLM, na sigla em inglês), que minimiza a latência ao desativar esse pós-processamento. Para mais detalhes sobre o ALLM, consulte a especificação do HDMI 2.1. Outras telas podem oferecer 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ática ou o modo de jogo seja usado, se disponível, solicitando o pós-processamento mínimo. Isso é útil principalmente para aplicativos de jogos e videoconferência, 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 todas as telas são compatíveis com o pós-processamento mínimo. Para descobrir se uma
tela específica é compatível, chame o
método Display.isMinimalPostProcessingSupported().
Dispositivos de entrada
As TVs não têm interfaces de toque. Por isso, é ainda mais importante acertar nos controles e garantir que os jogadores os considerem intuitivos e divertidos de usar. O processamento de controles também apresenta outros problemas que exigem atenção, como acompanhar vários controles e lidar com desconexões de maneira adequada. Todos os apps de TV, incluindo jogos, precisam lidar com controles de forma consistente. Leia Gerenciar controles de TV para mais informações sobre como usar controles de TV e Gerenciar 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 é compatível com 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 que você espera 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, você pode criar manipuladores de eventos de tecla 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 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
Os controles de jogo podem não estar disponíveis ou ativos para usuários de um dispositivo de TV. Para informar corretamente aos usuários que seu jogo é compatível com um controle de jogo, inclua a seguinte entrada no manifesto do app:
<uses-feature android:name="android.hardware.gamepad" android:required="false"/>
Observação:ao especificar a compatibilidade com android.hardware.gamepad, defina o atributo android:required 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" apenas se um controle de jogo for necessário para jogar.
A configuração android:required="true" mostra um selo "Gamepad required"
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 do Google Play Games, é preciso ter em mente algumas considerações sobre conquistas, login e jogos salvos.
Conquistas
Seu jogo deve incluir pelo menos cinco conquistas (que podem ser atingidas). Somente um 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 vai parar de perguntar. Saiba mais sobre o login em Como implementar o login no Android.
Salvando
Use os Jogos salvos do Google Play Services para armazenar seu jogo salvo. O jogo precisa vincular os jogos salvos a uma Conta do Google específica para que seja claramente identificável, mesmo em vários dispositivos. Se o jogador estiver usando um smartphone ou uma TV, o jogo precisa ser capaz de extrair as informações do jogo salvo da mesma conta de usuário.
Você também precisa oferecer uma opção na interface do jogo para que o jogador possa excluir dados armazenados localmente e
na nuvem. Você pode colocar a opção na tela Settings do jogo. Para saber mais 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. Faça isso em vez de usar o botão home para sair, já que 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 é compatível com navegadores 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 o melhor desempenho, e muitos usuários preferem Ethernet ao Wi-Fi para garantir esse desempenho. O app precisa verificar as conexões Wi-Fi e Ethernet. Se o app for apenas para TV, não será necessário verificar o serviço 3G/LTE como você faria em um app para dispositivos móveis.