Alunos:
- Jorge Melegati
- Leandro Lima
- Yves Conselvan
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 17/12/2008
Introdução
Como projeto para o exame de CES-22, nosso grupo realizou a criação de um jogo em 2D, ambientado no alojamento dos alunos do ITA e inspirado por recentes acontecimentos nesse lugar.
No jogo, o usuário pode se deslocar por vários quartos (cheios de bizus de veteranos), corredores e também lançar bombas. Há também um modo de jogo em rede, no qual dois adversários tentam eliminar um ao outro com as bombas.
Detalhamento do projeto
A linguagem utilizada para a criação do jogo foi a liguagem de programação D. Optamos por escolher uma linguagem mais obscura para aumentar o nivel de complexidade do trabalho. Vale ressaltar que não há muitos recursos disponíveis na internet para essa linguagem (além de ser extremamente dificil achar "D" em buscas). Sua semelhança com C++ em alguns aspectos possibilitou que nós utilizássemos algumas bibliotecas dessa liguagem (Derelict - SDL) como ponto de partida para o projeto. Utilizamos a versão 1.0 de D por causa de compatibilidade com o Derelict.
Derelict é um conjunto de bindings (forma de ter acesso a algumas funções de bibliotecas não nativas da linguagem) pra algumas bibliotecas. A bilbioteca multimídia SDL foi extremamente útil, pois ela nos municiou de vários recursos para criar as classes como as superfícies da parte gráfica, os eventos (para mouse e teclado) e as fontes para o menu e caixas de texto.
O código do programa possui boa portabilidade (pode ser compilado tanto em Linux quanto em Windows)
Endereço para o repositório SVN:
https://bomb-h.svn.sourceforge.net/svnroot/bomb-h
Pacotes:
Smallxml:
Nesse pacote foram implementadas as classes referentes a esse parser xml, cujo objetivo foi melhor interpretar o arquivo xml dado sua complexidade. No arquivo xml (config.xml) ficam as principais configuracoes do jogo como, por exemplo, tamanho da tela e posicao de objetos. O parser xml foi obtido no site http://www.dsource.org (site para projetos open source em D).
Engine:
Aqui estão as principais classes relativas ao jogo. A Engine provê um sistema com baixo acoplamento com o resto. Inclusive, pode ser aprefeiçoada para se tornar um framework, pois a partir de um xml e das classes principais, a engine pode ser utilizada como um aplataforma de criação de jogos 2D. Na classe engine foi usado o padrão de projeto Singleton, pois somente uma instância da engine seria permitida ao rodar o programa. Além disso, há também o padrão Decorator em Tile, Factory Method em ObjetoFactory, Strategy em TecladoBehaviour e Facade em Engine. Sem dúvida, esse foi o pacote mais complexo, demandando mais esforço, no qual os padrões puderam ser aplicados com extensividade.
Fig. 1 - Diagrama de classes
Rede:
Nesse pacote, estão as classes que possibilitam a utilização do jogo na modalidade Multiplayer. Basta, para isso, sabermos o IP do computador a ser conectado e entrarmos com essa informação no Menu Principal. Os padrão utilizados foram Observer (em ConnectionObserver e StreamObserver) e Proxy.
Fig. 2 - Diagrama de classes
StateMachine:
A StateMachine utilizada no Lab 3 foi portada para linguagem D e utilizada como plataforma para a geração dos eventos que se enquadram em seus requisitos. Nas classes desse pacote, observamos o padrão Command (em StateCommand e EventCommand) e o padrão Observer na classe com o mesmo nome.
Menu
Botões, caixas de texto e outros recursos referentes ao Menu Principal.
Fig. 3 - Diagrama de classes
Jogo:
Aqui estão as classes referentes a objetos e ao cenário de uma forma geral. As peculiaridades de cada elemento foram tratados em classes distintas, visando o desacoplamento do código. Observamos o padrão Observer em Bomb e Decorator em Espaco.
Fig. 4 - Diagrama de classes
Util:
No pacote Util estao presentes algumas classes de apoio às demais como direcao e fila.
Instalação / Compilação
Para rodar o jogo, basta seguir os seguintes passos:
- Baixar DMD v1.036
- Baixar e instalar Code::Blocks (ou outro ambiente de desenvolvimento compatível com a linguagem D)
- Configurar o caminho do diretório de instalação do DMD (No Code::Blocks fica em Compiler Settings)
- Baixar a biblioteca multimídia SDL
- Escolher o target e dar Build (verificando as bilbiotecas)
Foi possível criar um executável bem leve (aproximadamente 1,3 MB) mesmo com a biblioteca dinâmica.
Estatísticas do Desenvolvimento
O desenvolvimento do jogo foi realizado em várias e, para tal, monitoramos as atividades do grupo com relação a diversos aspectos do processo de desenvolvimento do jogo. Abaixo encontram-se os gráficos mostrando a evolução desses aspectos.
Tamanhos dos pacotes

Fig. 5 - Tamanhos dos pacotes
Atividade por pacote - Jorge

Fig. 6 - Jorge
Atividade por pacote - Leandro

Fig. 7 - Leandro
Atividade por pacote - Yves

Fig. 8 - Yves
Contagem de arquivos

Fig. 9 - Contagem de arquivos
Tamanho médio dos arquivos

Fig. 10 - Contagem de arquivos
Linhas de código do programa

Fig.11 - Linhas de código do programa
Screenshots do jogo
Abaixo, encontram-se algumas imagens retiradas do jogo em execução:
Fig. 12 - Bomberman passeando pelo H-8
Fig. 13 - Bomberman encontra um lugar para jogar uma bomba
Fig. 14 - Explosão da bomba
Fig. 15 - Modo Multiplayer
Conclusão
Durante a criação desse jogo vários conceitos explorados na matérias puderam ser revistos e colocados em prática. Uma das maiores dificuldades encontradas foi a questão de como tornar o código o mais desacoplado possível. Quando o programa consiste em poucas classes, fica mais fácil administrar as composições e heranças. Com muitos pacotes e um número ainda maior de classes (mais de 50!), torna-se extremamente necessário organizar o código para que aumente a coesão e diminua o acoplamento. Os padrões de projetos utilizados em toda a extensão do programa sem dúvida auxiliaram nesse sentido (além de exercerem suas funcionalidades próprias).
Como aspectos importantes a serem melhorados nas próximas versões, podemos apontar:
- Diminuição na velocidade de movimentação da personagem, pois notamos que há uma sensibilidade muito grande com os comandos do teclado, que faz com que fique mais rápida do que o previsto.
- Inserção de mais objetos (e consequentemente mais classes) no cenário (como camas, armários, estantes, geladeira), enriquecendo o ambiente.
- Redefinição das texturas dos objetos já existentes para aumentar a autenticidade da experiência.
- Introdução de personagens controlados pela máquina para interagir com o usuário (provavelmente o mais difícil e demorado a ser implementado).
- Introdução de música de fundo e sons para certos eventos utilizando a biblioteca SDL_Mixer.
- Suporte a mais jogadores no modo Multiplayer.
Possivelmente, a estrutura da Engine possa vir a se tornar um framework pra a criação de jogos 2D, já que vários requisitos para tal já se encontram implementados.





