sexta-feira, 31 de maio de 2013

JAVA GAMES 2D::Estrutura Básica do Game::03

Nesse III tutorial vamos aprender a criar a estrutura básica para os nossos jogos, definir o tamanho da janela(Frame), criar um Image Buffering e o gameLoop e etc...
Explicando algumas coisas:
Ao criarmos um código que por exemplo: movimente uma nave inimiga em um jogo como Space invader, para que a nave mova-se constantemente, o código que faz esse controle precisa ser executado constantemente, um outro exemplo: ao pressionar uma tecla para mover um personagem, os valores das variáveis que guardam sua posição X e Y seriam modificados, a imagem que aparece na tela precisa ser atualizada, para exibir o personagem em sua nova posição, então para que isso aconteça precisamo criar uma coisa chamamos de game loop, que seria nada mais do que um loop infinito!

1:  while(true){  
2:   //COMANDO!  
3:  }  

Outro detalhe importante do game loop, precisamos controlar a frequência com que a tela será atualizada e os métodos de controle interno do jogo! para isso usaremos o seguinte código:

1:  int FPS = 30; //TAXA DE ATUALIZAÇÃO DA TELA  
2:  while(true){  
3:   Thread.sleep(1000/FPS);  

O método sleep() receberá como parâmetro, um valor inteiro que será o tempo em milissegundos de uma PAUSA que ocorrerá! porem esse é um código perigoso que estamos mandando nossa aplicação executar, teremos então que tratar as exceções que poderão ocorrer, ficando assim:

1:  int FPS = 30; //TAXA DE ATUALIZAÇÃO DA TELA  
2:  while(true){  
3:   try{  
4:    Thread.sleep(1000/FPS);  
5:   }catch(){  
6:    System.out.println("Erro na Thread!");   
7:    //MENSAGEM A SER EXIBIDA NO CONSOLE CASO OCORRA ALGUM ERRO  
8:   }  

Outro detalhe importante na construção de games é, ao mandarmos desenhar algum objeto na tela, como um texto, imagem, forma geométrica, etc, devido ao game loop ficar atualizando a tela o tempo inteiro, dará uma sensação de leg, porque será desenhado na tela elemento a elemento, então qual seria uma solução para esse probleminha?
O Image Buffering, iremos criar um BufferedImage (buffer de imagem)!!!, como é que isso funciona?
Bem é o seguinte... não iremos mais desenhar elementos na tela, ao invés disso iremos desenhar os elementos no buffer, e por fim desenhar o que está no buffer na tela de uma vez só!

então ai segue o corpo do nosso game totalmente comentado:

1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import javax.swing.JFrame;  
4:  //A CLASSE GAME HERDA AS FUNCIONALIDADES DE JFRAME  
5:  public class Game extends JFrame {  
6:   BufferedImage backBuffer; //ESSE É O NOSSO BUFFER  
7:   int FPS = 30;  //ESSA É A TAXA DE ATUALIZAÇÃO DA TELA  
8:   int janelaW = 500;  //LARGURA DA TELA  
9:   int janelaH = 500;  //ALTURA DA TELA  
10:   //NO NOSSO METODO ATUALIZAR VAMOS CHAMAR OS METODOS  
11:   //QUE SERÃO EXECUTADOS O TEMPO INTEIRO...  
12:   public void atualizar() {  
13:   }  
14:   //NESSE MÉTODO VAMOS DESENHAR  
15:   //FORMAS GEOMETRICAS, IMAGENS E TEXTOS NA TELA E ETC...  
16:   public void desenharGraficos() {  
17:   Graphics g = getGraphics();//COM g IREMOS DESENHAR O QUE ESTÁ NO BUFFER NA TELA  
18:   Graphics bbg = backBuffer.getGraphics();//COM bbg IREMOS DESENHAR NO NOSSO BUFFER  
19:   //AQUI ESTAMOS DESENHANDO O BUFFER NA TELA,  
20:   //NAS COORDENADAS X:0 e Y:0  
21:   g.drawImage(backBuffer, 0, 0, this);  
22:   }  
23:   //ESSE É O NOSSO MÉTODO INICIALIZAR  
24:   //AQUI VAMOS INICIALIZAR ALGUMAS CONFIGURAÇÃO DO frame E OUTRAS CONFIGURAÇÕES  
25:   public void inicializar() {  
26:   setTitle("Titulo do Jogo!");//SETANDO O TITULO DA JANELA  
27:   setSize(janelaW, janelaH);//DEFINIDO AS DIMENSÕES DA JANELA  
28:   setResizable(false);//TIRANDO A PERMISSÃO DO USUÁRIO REDIMENSIONAR A JANELA  
29:   setDefaultCloseOperation(EXIT_ON_CLOSE);//QUANDO FECHARMOS O frame A APLICAÇÃO PARA DE EXECUTAR  
30:   setLayout(null);//COM ISSO PODEREMOS DEFINIAR COORDENADA E DIMESÕES DE ELMENTOS DE FORMULARIO NO NOSSO FRAME  
31:   setVisible(true);//MUDANDO A VISIBILIDADE DO frame PARA TRUE, ASSIM ELE APARECERÁ  
32:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);//CRIANDO O NOSSO BUFFER DE IMAGEM  
33:   }  
34:   //AQUI É O NOSSO MÉTODO RUN()  
35:   //NELE TEMOS O NOSSO GAME LOOP (UM LOOP INFINITO)  
36:   public void run() {  
37:   inicializar();//AQUI CHAMAMOS O METODO INICIALIZAR SOMENTE UMA VEZ, POIS ELE ESTÁ FORA DO NOSSO LOOP  
38:   while (true) {//AQUI É O NOSSO LOOP INFINITO  
39:    atualizar();//CHAMAMOS O METODO ATUALIZAR O TEMPO INTEIRO  
40:    desenharGraficos();//ATUALIZAREMOS O GRÁFICO QUE APARECE NA TELA O TEMPO INTEIRO  
41:    try {  
42:     Thread.sleep(1000/FPS); //TAXA DE ATUALIZAÇÃO NA TELA, FUNCIONA COMO UM DELAY  
43:    } catch (Exception e) {  
44:     System.out.println("Thread interrompida!");  
45:    }  
46:   }  
47:   }  
48:   //AQUI É O NOSSO MÉTODO PRINCIPAL  
49:   public static void main(String[] args) {  
50:   Game game = new Game();//CRIAMOS UM OBJETO A PARTIR DESSA PROPRIA CLASSE  
51:   game.run();//CHAMAMOS O METODO RUN(), O MÉTODO RUN() EXECUTA O INICIALIZAR(), ATUALIZAR() E DESENHARGRAFICOS()  
52:   }  
53:   //-----------------------------------------------------------------------------  
54:  }// FIM DO CÓDIGO FONTE  



Outro pequeno detalhe importante...
Como vamos desenvolver Games 2D, estaremos trabalhando dentro de um plano cartesiano... pra quem não sabe o plano cartesiano foi criado por René Descartes e consiste em em dois eixos perpendiculares um X e outro Y....

porem ....... aqui vai funcionar de uma maneira um pouquinho diferente....


É assim que vamos nos locomover dentro desse plano bidimensional !!!
Então é isso pessoal! continuem no próximo Tutor...

Nenhum comentário:

Postar um comentário