quarta-feira, 7 de agosto de 2013

Estrutura abstrata de um jogo

Como irei desenvolver jogos com uma IDE e um Framework, o que esconde a programação mais complexa por trás do game, irei postar algumas coisas sobre como funciona está lógica "oculta".

A a lógica do funcionamento de um jogo, vista de uma perspectiva ampla, é bem simples:
Há uma entrada (inputs) de informação;
O jogo fica em um looping infinito processando seus métodos;
Quando certos requisitos são fechados, o jogo termina, para o bem ou para o mal.

As entradas são conhecidas, não preciso me alongar sobre elas. Cabe ressaltar que mesmo a Unity sendo um facilitador, e compilando em quase todas as plataformas, são necessários scripts diferentes para que o jogo funcione no controle, ou no mouse e teclado, ou na tela touch.

O looping infinito é um caso interessante para que se entenda a lógica do desenvolvinento.
Vamos pensar em um shooter x boots.
O jogo renderiza imagens a todo instante, criando os conhecidos FPS (Frames Por Segundo), também faz com que seus personagens tomem decisões a todo instante, mudando elas de acordo com certas variáveis. O jogo também fica lendo certos status para saber quando é Game Over ou quando você atingiu certo número de Frags e ganhou.
Mas para quem conhece programação, sabe que normalmente um software só age quando "provocado". Além do mais, a estrutura básica de um programa é sequencial, se o método botPensando() está rodando, o método atingiuAsFrags() fica "na fila".
Para isso, o jogo usa o que chamamos de Runnable, uma forma de trabalho que fica perguntanto, o mais rápido possivel, a todos os métodos, o que eles tem para nos responder.
método run()
{
    atualizaTela();
    botPensano();
    atingiuAsFrags();
}

Estes 3 métodos serão chamados inúmeras vezes por segundo, assim, a todo instante:
a tela será recriada atualizando a imagem; 
o bot tomará decisões;
e o jogo irá verificar se a partida acabou.

Outra questão interessante é que os métodos correm de forma "livre" (assíncrona). Um não fica esperando o outro. Pois a atualização de frames será sempre a mais rápida o possível, enquanto o movimento do bot será dentro de uma linha temporal bem definida.

No mais, este mesmo runnable tem de saber a hora de acabar. Para isso, sempre haverá uma estrutura perguntando se a partida acabou. Caso afirmativo, o looping para.

gameover = false;
método run()
{
    atualizaTela();
    botPensano();
    gameover = atingiuAsFrags();

   SE (gameover for igual a TRUE)
    {
         runableStop
     }
}

Softwares que facilitam o trabalho escondem tudo isso do usuário. A própria Unity decide como organiza seus códigos, e onde coloca os scripts criados pelo autor. Mesmo assim, bons scripts e um software organizados são importantes, tanto para manutenção quanto para que a Unity venha a fazer o seu melhor ao gerar a arquitetura dos códigos.

Nenhum comentário:

Postar um comentário