Trabalhando o modelo
Já pegaram um código antigo de vocês e resolveram retrabalha-lo? Se você não soubesse que o autor era você mesmo, você certamente falaria mal. Pois bem, é o que estou fazendo com o Batalha Estelar.
O Batalha Estelar servirá como o primeiro modelo de implementação da Sofia IA. Relembrando, os motivos para eu ter escolhido esse jogo são:
- Eu conheço o código fonte: Como autor dele, não precisaria estudar um código de terceiros, nem desenvolver nada do zero. Isso certamente vai me poupar um tempo precioso, mesmo tendo que fazer várias modificações no código original;
- Tem uma física simples, em 2D: O jogo já é vetorial e tem uma física muito simples. Isso permite explorar facilmente algoritmos de steering behaviors, por exemplo.
- Não foi projetado originalmente com IA em mente: Será um desafio integrar corretamente a IA no software, além de melhorar meu conhecimento sobre em que “altura” do projeto a camada de IA deve ficar;
- Há vários pontos onde a integração com uma linguagem de script se faz interessante.
Iniciei passando o projeto para o Code::Blocks (o original era no Eclipse CDT) e simplificando vários aspectos do código, como por exemplo, aplicando de vez a STL no programa inteiro. O primeiro passo, já concluído, foi excluir todas as classes de exceção próprias e substitui-las por exceções padrão.
O próximo passo será eliminar char* printf por suas respectivas construções em C++, além de eliminar vários usos descenessários de ponteiros.
Também estou pensando em remodelar os métodos de pintura. Olhando o código hoje, vi que usei uma lógica um pouco confusa e pouco produtiva. Quero também reforçar o fato da fase pintura não poder alterar o estado do jogo e para isso terei que reorganizar um pouco os conceitos envolvendo o programa. Se sobrar tempo (o que é improvável) talvez eu passe a parte de desenho para OpenGL.
O jogo original usa o algoritmo de game loop do dr. Andrew Davidson, descrito no capítulo 2 do livro Killer Game Programming in Java, e portado por mim para C++. Esse algoritmo simplifica muito a física do jogo, pois mantém o espaço de tempo entre dois processamentos constante, mesmo que a taxa de quadros por segundo varie.
O que significa que, usando essa lógica, é geralmente inútil repassar para as funções internas do jogo a diferença de tempo entre uma iteração e outra e, portanto, todos os cálculos envolvendo esse parâmetro são eliminados.
Embora seja um algoritmo perfeito para a maior parte dos jogos simples, creio que serei obrigado a abrir mão dele algum momento, para entregar ao Sofia IA loops com variação de tempo maiores, e ver se a API se comporta corretamente.
Outro aspecto que vi que pode ser drasticamente simplificado é o tratamento de eventos. Minha idéia atual é criar uma classe que representa um jogador e implementar uma versão dessa classe tanto para a IA quanto para os seres humanos. No caso, a classe para o um jogador real seria responsável por questionar o estado do teclado. Isso eliminaria desenas de pequenas classes de Actions, que se mostraram pouco úteis no desenvolvimento original.
Um notícia para os usuários de internet mais lenta. Quem tentar baixar o Batalha Estelar atual notará que o tamanho do programa é de 23MB. Para essa versão do protótipo, vou incluir arquivos com as mesmas músicas em qualidade consideravelmente inferior, o que deve reduzir os binários para 3mb. Outra boa notícia é que vou hospedar o código no meu próprio domínio, e não no rapidshare.
O primeiro passo na Sofia IA e na sua integração com o Batalha Estelar será a construção de classes para Steering Behaviors.
Minha meta é ter o protótipo organizado e o primeiro steering behavior implementado (chase) ainda essa semana.