SBGAMES 2008 Tutorial Kitchen Defense (jogo J2ME)

Esse ano estou participando da SBGAMES ( Simpósio Nacional de GAMES) com um jogo que desenvolvi chamado Kitchen Defense.

fundoinicEsse game tem como cenário, uma cozinha comum eas panelas, leite entre outros, querem fugir dessa cozinha, resta ao saleiro e sua turma, não deixar eles irem embora.

O jogo tem uma mecânica bem simples de tower defense, aonde vc tem que construir torres e barreiras evitando que os inimigos ( no caso, os itens de cozinha), não consigam passar.

Vou explicar um pouquinho de como foi construído esse game.

Bem, primeiramente esse game foi construindo em J2ME , então ele roda em todos os celulares que tem o java instalado.

Para a construção de qualquer game, sempre vamos precisa de um loop principal aonde se define o tempo de updade do stage do game e também definimos quais mudanças acontecem.

No caso do J2ME abrimos uma thread dando um extends na classe GameCanvas e implementamos os métodos da  Runnable, aonde teremos os metodos, Run(),Stop(),Start().

Método START

Esse método inicia a classe e grava o processo, sendo assim ele inicia a thread, nesse método, colocamos as variáveis inicias do game, como total de vidas, zeramos o score entre outras coisas.

Ela ficaria desse jeito:

public final void start() {
this.vidas = 0;
this.score = 0;
this.turno = 0;
this.executando = true;
Thread t = new Thread(this);
t.start();
}

Note que nelas temos uma var chamada “executando” e definimos ela como true, isso server como um controle para o nosso loop principal, junto com isso temos a classe Thread aonde passamos como parâmetro a propria classe “this”, com isso registramos ela como um processo que ficara sendo executado na memoria.

Metodo Run

Esse método contem o loop  principal do jogo, e nele aonde a magica do game acontece.

Dentro dele fica todas as mudanças e validações do jogo assim como tirar e colocar elementos no jogo.

Por exemplo:

while (this.executando){
if(!this.perdeu){

faz mudancas caso o jogador tenha perdido o game

}

this.layerManager.paint(g,0,0); // repinta a layzer principal
g.setColor(0xffffff); // seta a layer com a cor prtea
this.repaint(); // regera a tela
this.flushGraphics(); // limpa o buffer de memoria
try{
Thread.sleep(100); // tempo de espera para renderizar o game, o famoso frames por segundo
}catch(InterruptedException e){
e.printStackTrace();
}
}

Metodo Stop

Esse método e responsável por para o game, existem duas coisas que podemos fazer, resetar o jogo ou deixar ele pausado, esse método e chamado em especial quando seu celular toca, quando chega sms, quando você volta para a tela inicial ou seja, quando essa thread fica parada.

No caso desse game seremos bem simplistas e vamos apenas reiniciar o game, para isso devemos sair do nosso loop principal

public final void stop() {
this.executando = false;
}

Bem esse seria o laco principal do game, agora vamos colocar alguns inimigos e fazer a tela inicial.

definifundNesse caso para facilitar o processamento, decidi criar uma tela inicial ja com todos os elementos na imagem, aonde eu apenas mapeio a imagem e verifico aonde o usuário clicou

Com isso ganhamos desempenho, aonde o aparelho carrega apenas uma imagem e não precisa ficar sobrepondo imagens e renderizando, mais com essa escolha deixamos a tela do game um pouco menos flexível.

 

Agora vamos aos nosso “vilões” do game, cada vilão e uma sequencia de movimento em um único arquivo png, guando carregar eles para a memoria do aparelho, ele fica como uma imagem e nos mostramos um quadro de cada vez, isso significa que vamos dividir o png em questão em pequeno splits dentro da nossa classe.

Segue alguns exemplos:

bananaanima caixaleiteanima canecaanima chaleiraanima colheranima panelaanima torradeiraanima xicaraanima

 

Pronto agora que temos nossos vilões vamos criar uma classe para eles dentro do app

public class Montros extends Sprite

Essa classe pega todos os métodos da classe Sprite do java e depois disso cria o movimento dos monstros  em cima do png, agora podemos criar vários vilões segue um exemplo de como ficaria o vilão banana:

public class Banana extends Montros {
public Banana(int delay,int lv) throws IOException {
super(Image.createImage(“/mostros/bananaanima.png”),30,35);
this.defineReferencePixel(10,12);
this.setDelay(delay);
this.setFrameMonstro(0);
this.setVida(30);
this.setLevel(lv);
}
}

Observe que temos o caminho do sprite do png, eo tamanho em pixel dos cortes, isso que dizer que ele vai dividir essa imagem de pequeno blocos de 30×35, e logo depois ele passa quais as propriedades que o vilão banana tem para a classe mostro.

Pronto ja temos o menu inicial, ja temos os vilões agora vamos para os nosso heróis.

Um herói dentro do game, acaba sendo bem parecido com um mostro, afinal ambos são elementos dentro do nosso pequeno stage chamado cozinha, mais como as propriedades deles são diferentes, vamos criar nossa classe para eles e chamar de Defesa

public class Defesa  extends Sprite

O processo seria o mesmo criamos a classe, fazemos os pngs dos nosso heróis

oleo paliteiroanima saleiro

So que nesse caso, eles não adam apenas ficam parados atirando e servindo de barreira para que nosso vilão não consiga fugir.

Agora vamos inserir um herói dentro do stage e instanciar as propriedades dele

public class Saleiro extends Defesa {
public Saleiro(int x,int y) throws IOException {
super(Image.createImage(“/saleiro.png”),30,35,x,y);
this.defineReferencePixel(9,12);
this.setPreco(10);
this.setDano(15);
this.setDelay(6);
}
}

 

Pronto ja temos nosso games, apesar de ser um game bem simples sem muitas complicações, ele acaba mostrando bem alguns recursos eo quanto e possível e simples fazer um game em J2ME

Agora estou disponibilizando o fonte caso alguém queira mexer e ver funcionando por completo download

Pagina do festival de jogos da SBGAMES

http://www.inf.pucminas.br/sbgames08/trabalhos_FestivalJogos.htm

Bookmark the permalink.