Criar jogos para TV

A tela da televisão 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 controles e o fato de que todos os jogadores estão visualizando a tela ao mesmo tempo.

Tela

Os dois pontos principais a serem considerados ao desenvolver jogos para a tela da TV são projetar o jogo para uma orientação paisagem e oferecer compatibilidade com 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 serem exibidos no modo paisagem.

Modo automático de baixa latência

Algumas telas podem fazer pós-processamento gráfico. Esse pós-processamento melhora a qualidade gráfica, mas pode aumentar a latência. 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 desativando esse pós-processamento. Para mais detalhes sobre o ALLM, consulte a especificação HDMI 2.1. Outras telas podem ser compatíveis com um modo de jogo com comportamento semelhante.

No Android 11 e versões posteriores, uma janela pode solicitar que o modo de baixa latência automática ou o modo de jogo seja usado, se disponível, solicitando pós-processamento mínimo. Isso é particularmente útil 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 pós-processamento mínimo. Para descobrir se uma tela específica é 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 controles corretos e garantir que os jogadores os considerem intuitivos e divertidos de usar. O manuseio de controladores também apresenta alguns outros problemas a serem observados, como acompanhar vários controladores e lidar com desconexões corretamente. Todos os apps de TV, incluindo jogos, precisam gerenciar controles de forma consistente. Leia Gerenciar controles de TV para mais informações sobre o uso de controles de TV e Gerenciar controles para jogos para informações específicas sobre o uso de controles de TV para jogos.

Layouts de teclado

No Android 13 (API de nível 33) e versões mais recentes, é possível determinar layouts de teclado usando getKeyCodeForKeyLocation(). Por exemplo, seu jogo oferece suporte a movimentos com as teclas WASD, mas isso pode não funcionar corretamente em um teclado AZERTY que tenha as teclas A e W em locais diferentes. É possível receber os códigos de tecla para as chaves 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, você pode criar manipuladores de eventos de teclas para esses códigos de teclas e implementar o comportamento esperado.

Manifest

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, defina o atributo android:isGame como "true" na tag <application> do manifesto do app. Por 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 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, 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, consulte Manifesto do app.

Serviços relacionados a jogos do Google Play

Se seu jogo integrar os serviços relacionados a jogos do Google Play, será necessário pensar em várias considerações relacionadas a 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 em um dispositivo de entrada com suporte poderá 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 salvamento de jogos. Seu jogo precisa vincular o salvamento de jogos a uma Conta do Google específica para ser identificável mesmo entre os dispositivos. O jogo precisa ser capaz de extrair as informações de salvamento da mesma conta de usuário, seja usando um celular ou uma TV.

Você também precisa fornecer uma opção na IU do jogo para permitir que o jogador exclua dados locais e armazenados na nuvem. Você pode colocar a opção na tela Settings do jogo. Para ver 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. Faça isso em vez de depender do botão home para fornecer uma saída, já 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ídias sociais.

Redes

Com frequência, os jogos precisam de uma largura de banda maior para oferecer o melhor desempenho, e muitos usuários preferem a Ethernet em vez de Wi-Fi para garantir essa performance. Seu app precisa verificar as conexões Wi-Fi e Ethernet. Caso seu app seja apenas para TV, não é necessário verificar o serviço 3G/LTE, como você faria com um app para dispositivos móveis.