Criar jogos para TV

A tela da televisão apresenta uma série de considerações que podem ser novas para jogos 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 principais pontos a ter em mente ao desenvolver jogos para a tela da TV são projetar seu seu jogo para orientação paisagem e oferecer suporte para 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 projetar que seus jogos para TV sejam exibidos em modo paisagem.

Modo de baixa latência automática

Algumas telas podem executar o pós-processamento gráfico. Esse pós-processamento melhora os gráficos mas pode aumentar a latência. Telas mais recentes compatíveis com HDMI 2.1 têm um baixo automático 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. Outra opção as telas podem ser compatíveis com 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 com os melhores gráficos possíveis.

Para ativar ou desativar o pós-processamento mínimo, chame Window.setPreferMinimalPostProcessing(), ou defina o horário preferMinimalPostProcessing para 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 possuem interfaces de toque, por isso é ainda mais importante ter os controles corretos e para garantir que os jogadores os considerem intuitivos e divertidos de usar. Gerenciar controladores também apresenta algumas outras questões a serem observadas, como manter o controle de vários controladores e o processamento de desconexões normalmente. Todos os apps de TV, incluindo jogos, devem lidar com controladores de modo 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 conferir os códigos de tecla para as chaves 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 estão definidos como KeyEvent.KEYCODE_S e KeyEvent.KEYCODE_D, respectivamente. Agora você pode criar manipuladores de eventos de chave para códigos de teclas 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 android:isGame para "true" no manifesto do app <application> . 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 o suporte a android:hardware:gamepad, não defina o android:required para "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 ele integrar os serviços relacionados a jogos do Google Play, você deve ter em mente 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 controlando a jogabilidade de um dispositivo de entrada compatível deve ser capaz de ganhar conquistas. Para mais informações sobre 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 vezes seguidas, o jogo deve parar de perguntar. Saiba mais sobre o login em Como implementar o login em Android.

Salvando

Use os Jogos salvos do Google Play Services para armazenar salvar seu jogo. 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.

Você também deve fornecer uma opção na interface do usuário do jogo para permitir que o jogador exclua localmente e os dados armazenados na nuvem. Você pode colocar a opção na tela Settings do jogo. Para Para ver informações específicas 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. Isso deve ser acessível com os botões de navegação do botão direcional. Faça isso em vez de depender da Botão home para fornecer uma saída, já que ela não é consistente nem confiável em diferentes controladores.

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 logins nos serviços de mídia social.

Redes

Os jogos costumam precisar de uma largura de banda maior para oferecer o desempenho ideal, e muitos usuários preferem ethernet para Wi-Fi para fornecer esse desempenho. Seu app precisa verificar a existência de Wi-Fi e Ethernet conexões de rede. 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.