Páginas

sábado, 8 de março de 2008

Jogo Game Caper (em Java)

Vocês já fizeram algo pensado que seria só mais uma alguma coisa entre todas as demais e então isto foi tão bem aceito por outras pessoas que você percebeu que tinha feito algo bom, talvez inútil, mas que fico no mínimo bom?

Comigo já aconteceu, foi o caso de um jogo, que desenvolvi na faculdade. Eu o batizei de Game Caper (muitos perguntam oque é caper em inglês, eu mesmo tive muito trabalho em achar a tradução em um dicionário, significa cabo).
Foi para um trabalho de faculdade, tinha que entregar qualquer "coisa" feito em JAVA e como já tinha alguma experiencia em java, resolvi fazer um joguinho que gostava de jogar, b-zero(provavelmente desenvolvido em C/C++), fiz diversas alterações no original (editor de tela e de traco, gráficos e sons muito melhores, níveis, e outras coisas mais).
Segue abaixo um print do jogo:

Figura1















Para quem quer jogar, dar uma olhada, ver o fonte ou mesmo alterar o fonte, segue o link para download:
http://sourceforge.net/projects/gamecaper/

Agora às dúvidas frequentes:

Este jogo me ajudou a desenvolver diversos conceitos de desenvolvimento OO, e a perceber o quando é importante um programador Java conhecer padrões de projeto.

Segue abaixo um diagrama que mostra como as classes se relacionam.

Figura2

Caper é um JFrame, nele possuo um JDesktopPane , onde é exibido demais janelas.

A principal lógica do jogo começa em Area, que estende JPanel.

A estrutura de pintura do jogo é baseado no padrão Composite, a Area contém Arena que contém os Blocos, que contem Comportamentos, que possuem as imagens, então no momento de pintar é passado uma única imagem que é pintada primeiro por cada Bloco depois pela Arena em si, depois pelo Traço, depois por efeitos(ex. fogo), e por fim, pelos status do jogo na classe Area (ex. pontuação).

As telas são montadas através da classe ArenaModel, que é na verdade, dois valores iniciais que dizem em posição da tela o jogador irá iniciar(x e y em matrix e não coordenadas) e uma matriz de inteiros, 20 x 14, onde cada valor simboliza um tipo de bloco, exemplo: 0 = vazio, 1 = pedra, 6 = bomba.
No caso da fase exibida na figura1, seu model seria:
18
2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1
1 0 0 0 0 0 1 1 6 1 1 1 6 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 1 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 1
1 6 6 6 1 1 1 1 6 6 6 6 6 6 6 0 0 0 0 1
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Na prática eu não deixo a coisa certinha assim, eu deixo tudo em uma única linha para impedir que os usuários mais básicos fuçassem, o importante é ter um espaço entre um numero e outro.

Então toda vez que passamos de fase, é recriado 280 blocos na tela?

Na verdade não, os blocos são criados uma única vez, bloco é uma classe que possui o conhecimento necessário para qualquer tipo de bloco, seja uma pedra, uma rocha, uma bomba ou mesmo um espaço vazio, a diferença está em que comportamento ele irá assumir. Para isto existe uma classe ComportamentoBloco, e destas só são criados um único comportamento por tipo de comportamento, que são passados a cada bloco que deve assumir seu tipo de comportamento.

Vamos ver na prática como funciona:

Se isto fosse um mini modelo:
111111
100001
100000
111111


Sua próxima fase poderia ser:
111111
100001
100000
161616


Os blocos continuariam os mesmos, a diferença está em passar o comportamento 6(no caso do meu jogo é a bomba), que só tem uma instancia, para alguns blocos da ultima linha. Com esta arquitetura nunca preciso destruir um objeto, pois os blocos serão sempre os mesmos, apenas mudarão de comportamento, e os comportamentos são apenas um por tipo e são passados a todos os blocos que devem estar com este comportamento.

E como o jogo sabe onde se ganha e onde se perde?
Se o jogador sair da tela, pela margem inferior, significa morte, e por qualquer outra margem significa vitória. Na ArenaModel são inseridos blocos de compartamento vitória e derrota em volta de toda a arena, que através do padrão Observer avisam a classe Arena que houve vitória ou derrota, para que ela decida se incrementar ou decrementar os pontos, restartar ou passar para a próxima fase, e assim por diante.
vvvvvvvvv v=vitória d=derrota
v.......v
v.......v
ddddddddd


Muitos me perguntam se utilizei threads, e sempre respondo "com certeza", é impossível desenvolver algumas coisas sem threads.
Imaginem sempre que for tocar um som eu não poder atualizar a imagem, ou enquanto o jogador segura uma tecla apertada, que eu tenho que por exemplo incrementando alguma variável, não poder ser tocado qualquer som, ou ainda simplesmente tocar um som por vez. Threads são uma necessidade.

Onde está indicado qual será a ultima fase? Afinal jogamos para nos divertir mas queremos ver o que vai aparecer quando chegarmos ao final (no meu jogo não é muito diferente do Game Over).

O níveis seguem um padrão de nome para as fases. Ex: Medio01.map, Medio02.map, Medio03.map, Medi...

O jogo irá abrindo um após o outro, quando não encontrar o próximo ele entende que o jogador chegou à final.

Acho que citei tudo de importante, qualquer dúvida basta perguntar.

4 comentários:

  1. fala Flavio... eu nao te conheço e vc também nao me conheçe, mas esse seu jogo ficou muito legal... cheio de cores de som.... EMOCIONANTE.

    Mané!

    ResponderExcluir
  2. fala Flavio... como vai?

    Estou dando uma passada aqui pra ver se tem alguma novidade que eu esteja por fora mas já vi que esse seu blog tá por fora!!!

    Faz um favor para as pessoas honestas que navegam na internet... deleta esse seu blog...

    ...Brincadeira...deixa esses comentários sobre o game caper ai que um dia eu quero ver se eu me dedico a pelo menos entender a logica!

    Abraço
    Joao Mané

    ResponderExcluir
  3. O #bichosafado .... sempre elogiei pessoalmente sua iniciativa ... mas c sabe como é .... palavras ditas "evaporam" no espaço ... por isso quero deixar registrado minha profunda admiração pelo profissional e amigo q vc eh .... poucas pessoas são assim como vc. Parabéns pelo jogo e camaradagem em abrir o código fonte ;-)

    Um grande abraço.

    ResponderExcluir
  4. Fico contente que tenha gostado Danilo! :D

    ResponderExcluir

Related Posts Plugin for WordPress, Blogger...