Em 12 de março de 2005, começou em Curitiba a pós-graduação em Desenvolvimento de Jogos da Unicenp. As aulas eram em sábados alternados, das 9h às 18h. O curso estava previsto para catorze meses, até setembro de 2006, mas terminou só em 10 de janeiro de 2007, com a entrega de um Pacman para celular.
Foi ali que nasceram os primeiros jogos do que viria a ser o Guima Games. Este artigo conta o que foi feito em cada etapa, em que tecnologia, e o que esses trabalhos de aula deixaram de herança para os jogos que você encontra hoje no portal.
O que se estudava
A grade dá uma ideia do que é preciso saber para fazer um jogo do zero:
- C++ para jogos
- Game Design I, II e III
- Computação Gráfica I e II
- Arquitetura de Engines
- Inteligência Artificial
- Multiplayer
- Jogos para celulares
O curso também ensinava um roteiro de documento de game design, o texto que descreve o jogo antes de ele existir: conceito, regras, controles, fases, personagens. Escrever o jogo antes de programá-lo parece burocracia, até o dia em que você descobre no meio do código que não sabia o que o jogo deveria fazer.
Tarefa 1: Batalha Naval em modo texto
O primeiro projeto foi uma Batalha Naval em modo texto, escrita em C++. Sem gráficos: o tabuleiro aparece como caracteres no terminal, e o jogador digita as coordenadas do tiro.
É o tipo de projeto que parece pequeno e ensina o essencial:
- o laço do jogo: ler a jogada, atualizar o tabuleiro, mostrar o resultado, repetir;
- o estado: onde estão os navios, quais casas já levaram tiro, quem está ganhando;
- a validação da entrada: uma coordenada fora do tabuleiro ou repetida precisa de resposta, não de travamento.
Bug marcante: havia implementado tudo que sabia de padrões de orientação objeto, e ficou complicado de explicar para outras pessoas. Quando portei pra celular, funcionou no emulador mas não no Android, ai simplifiquei tudo, ai tudo fucnionou bem ... liçào 1: KISS: Keep It Simple Stupid
Tarefa 2: a mesma Batalha Naval, agora com imagem
A segunda tarefa foi refazer a Batalha Naval em 2D, com SDL, OpenGL e Lua. A regra era a mesma; o que mudava era tudo em volta:
- SDL abre a janela, lê o mouse e o teclado e toca sons;
- OpenGL desenha na tela usando a placa de vídeo;
- Lua é uma linguagem pequena, feita para ser embutida em outros programas, e serve para guardar regras e comportamentos fora do código compilado em C++.
Refazer o mesmo jogo com outra tecnologia é um exercício subestimado. Como as regras já estão resolvidas, toda a atenção vai para a técnica nova. E fica claro o que é jogo (as regras da Batalha Naval) e o que é motor (desenhar, ouvir o mouse, tocar o som).
Foi também numa das primeiras aulas de SDL que aconteceu a história contada no artigo O Pong que não morre: a turma tinha cerca de uma hora para fazer um Pong, e eu fui o único dos trinta que não terminou.
Crazyroids e Gênius Faraó 3D
Os trabalhos seguintes continuaram na mesma base de C++, SDL, OpenGL e Lua:
- Crazyroids, um jogo 2D no estilo Asteroids, usado também como teste da engine;
- Gênius Faraó 3D, uma versão em três dimensões do clássico jogo de memória de sequência de cores e sons.
O Gênius é um parente distante do GG Colors, o jogo de memória de sequência do portal. A mecânica é a mesma de vinte anos atrás: o jogo mostra uma sequência, você repete, a sequência cresce.
Pacman 2D: a disciplina de Inteligência Artificial
Na disciplina de IA, o projeto foi um Pacman 2D em SDL com duas peças interessantes: um gerador de mapas e fantasmas que encontram o caminho até o jogador usando o algoritmo A\* (lê-se "A estrela").
O A\* é o algoritmo clássico para achar o menor caminho num mapa. Ele explora o labirinto a partir do fantasma, mas não às cegas: dá preferência às casas que parecem mais próximas do destino. Para cada casa, soma duas coisas:
- quanto já custou chegar até ela;
- uma estimativa de quanto falta até o alvo (no Pacman, a distância em linha reta ou em "quarteirões").
Em seguida, expande sempre a casa com a menor soma. Num labirinto como o do Pacman, isso encontra o caminho mais curto muito mais rápido que testar todas as rotas.
Hoje o GG Pacman do portal tem outra proposta: os fantasmas são controlados por outras pessoas, em multiplayer. Mas o labirinto e a perseguição vêm daquele trabalho de IA.
O projeto final: Pacman 3D e a engine ACAGL
O projeto final da pós foi um Pacman 3D em C++, OpenGL e SDL, aprovado em 21 de novembro de 2006.
Para fazê-lo, desenvolvi uma engine própria, a ACAGL. Ela partiu da engine ACA, criada pelo coordenador do curso, Fábio Binder, e foi ampliada com Lua e com a biblioteca FTGL, que desenha texto em OpenGL.
Fazer uma engine para um único jogo é uma decisão que só se justifica num contexto de estudo. Mas como estudo ela é imbatível: obriga a entender cada camada, da janela ao texto na tela, e a decidir onde termina o motor e onde começa o jogo.
Pacman para celular
O curso terminou com um terceiro Pacman: uma versão para celular em J2ME, o Java dos aparelhos da época, usando o perfil MIDP. Em 2006, "jogo de celular" significava tela pequena, teclado numérico e pouquíssima memória, e isso obrigava a pensar o jogo de novo, em vez de só encolher o do computador.
Depois da pós: a ACAGL no SourceForge
Em agosto de 2009, voltei à ACAGL. Ela tinha sido escrita no Visual Studio 6; migrei para o Visual Studio 2005 e 2008, acrescentei controle de som e volume e publiquei o código no SourceForge.
O post daquela época tem uma frase que eu repetiria hoje: aprimorar uma engine "é divertido só para o programador". Para quem joga, o que importa é o jogo. Por isso, nos anos seguintes, troquei a engine própria por ferramentas prontas (XNA, Unity, Unreal, Phaser) e passei a gastar o tempo no que o jogador vê.
O que esses trabalhos de aula deixaram
Quase todos os jogos do portal têm um antepassado naquela pós:
| Trabalho da pós | Parente no portal hoje |
|---|---|
| Pong em SDL (não terminado) | GG Pong |
| Gênius Faraó 3D | GG Colors |
| Pacman 2D com A\*, Pacman 3D | GG Pacman |
| Batalha Naval, jogo de tabuleiro por turnos | GGBoard |
E algumas lições que continuam valendo:
- Escreva o jogo antes de programar. O documento de game design poupa reescritas.
- Refaça o mesmo jogo com outra técnica. Fica claro o que é jogo e o que é motor.
- Algoritmos clássicos resolvem problemas reais. O A\* de uma aula de IA é o mesmo dos jogos comerciais.
- Engine própria ensina, mas não é o produto. O jogador quer jogar.
