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
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