sexta-feira, 31 de maio de 2013

JAVA GAMES 2D::Exportando para *.jar::15

Olá pessoal!
Nesse tutorial mostrarei como exportar o nosso game para o formato *.jar Runnable ("Executável"), uma coisa que iremos querer fazer após terminarmos de desenvolver um game é gerar o executável para distribuir para os nossos usuários/clientes!
Muito bem vamos lá!
Estarei aqui usando a IDE Eclipse para exportar o nosso game para *.jar <<download do Eclipse>>
o ideal quando estivermos desenvolvendo um game, é ter um projeto na workspace somente para o jogo que estamos desenvolvendo, quando estudamos o básico de java, aprendemos que o método main() é o método principal, nossa aplicação começará a ser executada a partir do método main(), normalmente em um projeto temos várias classes, ao exportarmos o game, temos que informar em que classe está o método main(), observe a figura abaixo (vamos exportar o game Snake)
Esse é um print de uma workspace minha, observe o projeto snake, dentro dele temos um pacote chamado game, e dentro do pacote game temos a classe Game.java que contem o método main(), então para começar a exportação faremos assim:
1- pressione o botão direto sobre o projeto snake e em seguida clique sobre "Export..." ou "Exportar...".
2- na janela que aparecerá clique em java e em seguida clique sobre Runnable JAR file, agora clique em Next ou Próximo.
3- agora em Launch configuration escolha o item que é [Nome da classe com método main]-[Nome do projeto] nome caso aqui é Game - Snake, em Library Handling (Biblioteca de manipulação), escolha Package required libraries into generated JAR (pacote exigido em bibliotecas JAR gerado.)
Agora em Export destination, escolha a pasta destino para onde você deseja exportar o "executável" do seu game e dê um nome ao arquivo, (eu estou salvando em minha área de trabalho com o nome Snake.jar).
4- para finarlizar clique em finish.

Muito simples não é? está ai o "executável" do nosso game, para que usa Ruindows Windows basta clicar duas vezes sobre o arquivo para executar o game, para quem usa alguma distro do Linux pode ser feito de uma das seguintes formas: clicar com o botão direito sobre o arquivo e escolher "Abrir com Java(TM) Platform SE Binary" ou abrir o terminal entrar no diretório onde o arquivo está salvo e exucutar a seguinte linha de comando: sudo java -jar nome_do_arquivo.jar.

Observe como ficou o meu:
Obrigado por visitar o blog!
Não deixem de comentar ou postar duvidas aqui! Até o nosso próximo tutorial!
Os tutoriais seguintes serão uma série de jogos que iremos construir do começo ao fim, comentado linha por linha!

JAVA GAMES 2D::Menu::14

Olá pessoal!
Nesse tutorial iremos mostrar uma maneira de como construir um menu para os nossos games, além da classe Game.java que iremos criar no nosso pacote tutorial14 dentro do projeto JAVAGAMES2D iremos também criar um uma classe chamada Menu.java.  então é o seguinte, na classe Menu.java, iremos definir como os nossos menus irá se comportar, e iramos criar um menu dentro Game.java.



No exemplo de hoje teremos três cenários, e um menu que nos levará para cada cenário(Jogar, Opções e Ajuda) e um item no menu para sair do game!

Observe com atenção a nossa classe Menu.java (Leia os comentários com atenção!)

1:  import java.awt.Color;  
2:  import java.awt.Font;  
3:  import java.awt.Graphics;  
4:  import java.awt.event.KeyEvent;  
5:  import java.awt.image.BufferedImage;  
6:  public class Menu {  
7:   int cenario = -1;  //ESSA VARIAVEL INDICA EM QUE CENÁRIO ESTAMOS, -1(NENHUM CENÁRIO) (0,1,2,3...N) OUTROS CENÁRIOS  
8:   int itemSelecionado = 0; //ESSA VARIAVEL SERVIRÁ PARA INDICAR QUAL ITEM QUE ESTÁ SELECIONADO (o atual é zero que é o primeiro item do menu)  
9:   String itens[];  //aqui vamos guardar os itens do nosso menu (jogar, opções, sair...etc)  
10:   Graphics bbg;  //como nos outros métodos da classe game.java usamos essa varialvel para desenhar elementos na tela  
11:   boolean ativo;  //indica se o menu está ativo ou não (ao inicar o jogo desativamos o menu, para o controlemos durante o jogo)  
12:   int x;   //coordenada x do menu  
13:   int y;   //coordenada y do menu  
14:   int tamanhoDaFonte = 20; //nem precisa explicar não é ?  
15:   int distanciaEntreItens = 15;//distância entre cada item do menu!  
16:   Font fonte = new Font("Arial", Font.BOLD, tamanhoDaFonte);//a fonte do nosso menu  
17:   Color corSelecionado = new Color(255, 0, 0); // COR VERMELHA para o item selecionado  
18:   Color corNaoSelecionado = new Color(0, 0, 0); // COR PRETA para o item que não está selecionado  
19:   //isso é o construtor ao criarmos o objeto do tipo Menu, teremos que informar o número de itens as coordenadas e se ele estará ativo ou não!  
20:   public Menu(int numeroDeItens, int x, int y, boolean ativo) {  
21:   itens = new String[numeroDeItens];  
22:   this.x = x;  
23:   this.y = y;  
24:   this.ativo = ativo;  
25:   }  
26:   //esse metodo só chamará o método controlaMenu se ele estiver ativo!  
27:   public void controlar(KeyEvent e) {  
28:   if (ativo) {  
29:    controlarMenu(e);  
30:   }  
31:   }  
32:   //esse método nos fará retornar ao menu ao pressinarmos "Esc"  
33:   public void voltarAoMenu(KeyEvent e){  
34:   //se tecla pressionada for igual a "Esc"  
35:   if(e.getKeyCode() == e.VK_ESCAPE){  
36:    cenario = -1; //com isso sai dos cenários em que estivermos...  
37:    ativo = true; //e reativa o menu para que o possamos controlar novamente...  
38:   }  
39:   }  
40:   //esse método controlará o nosso menu através do teclado  
41:   //ele é chamando dentro do método controla()  
42:   private void controlarMenu(KeyEvent e) {  
43:   //se pressionar a tecla "cima" diminui 1 em itemSelecionado  
44:   if (e.getKeyCode() == e.VK_UP) {  
45:    itemSelecionado -= 1;  
46:   }  
47:   //se pressionar a tecla "baixo" aumenta 1 em itemSelecionado  
48:   if (e.getKeyCode() == e.VK_DOWN) {  
49:    itemSelecionado += 1;  
50:   }  
51:   //isso aqui é para controlar os limites extrmos do menu  
52:   //caso eu esteja com 1º item selecionado e pressione para cima, ele vai para a ultima opção  
53:   //caso eu esteja com o ultimo item selecionado e pressione para baixo, ele vai para primeira opção  
54:   if (itemSelecionado >= itens.length) {  
55:    itemSelecionado = 0;  
56:   }  
57:   if (itemSelecionado < 0) {  
58:    itemSelecionado = itens.length - 1;  
59:   }  
60:   //se pressionar a tecla Enter ele muda o valor de cenario para o item que está selecionado  
61:   //isso fará mudar de cenário e desativará o menu para que ele não seja mais controlado!  
62:   if(e.getKeyCode() == e.VK_ENTER){  
63:    cenario = itemSelecionado;  
64:    ativo = false;  
65:   }  
66:   }  
67:   //esse método irá desenhar o nosso menu na tela!  
68:   //a um loop (for) que irá listar todos os itens que está guardado em itens[]  
69:   //um calculo é feito para a coordenada y de cada intem do nosso menu, para que eles fiquem  
70:   //um distante do outro, então caso y = 10, o item 0 será: 10+(0*(20+15)) = 10  
71:   //para o item 1 será: 10+(1*(20+15)) = 45  
72:   //para o item 2 será: 10+(2*(20+15)) = 80  
73:   //para o item 3 será: 10+(3*(20+15)) = 115, e assim por diante...  
74:   public void desenharMenu() {  
75:   bbg.setFont(fonte);//seta a fonte que definimos bem acima na declaração de variáveis  
76:   for (int i = 0; i < itens.length; i++) {// aqui é o inicio do nosso loop  
77:    if(itemSelecionado == i){//se ele estiver selecionado muda a cor para vermelho e desenha o item na tela  
78:    bbg.setColor(corSelecionado);  
79:    bbg.drawString(itens[i], x, y+(i*(tamanhoDaFonte+distanciaEntreItens)));  
80:    }else{//se não estiver selecionado muda a cor para preto e desenha o item na tela  
81:    bbg.setColor(corNaoSelecionado);  
82:    bbg.drawString(itens[i], x, y+(i*(tamanhoDaFonte+distanciaEntreItens)));  
83:    }  
84:   }  
85:   }  
86:  }  

Agora veja como criaremos o nosso menu dentro de Game.java, (leita os comentários com atenção!)

1:  import java.awt.*;  
2:  import java.awt.event.KeyEvent;  
3:  import java.awt.event.KeyListener;  
4:  import java.awt.image.BufferedImage;  
5:  import java.io.File;  
6:  import javax.swing.ImageIcon;  
7:  import javax.swing.JFrame;  
8:  public class Game extends JFrame implements KeyListener{  
9:   BufferedImage backBuffer;  
10:   int FPS = 30;  
11:   int janelaW = 500;  
12:   int janelaH = 500;  
13:   //AQUI DECLARAMOS O NOSSO MENU COM:  
14:   //4 itens, coordenadas x e y = 100, a ativo = true  
15:   //agora olhe esse método abaixo cenarios()  
16:   Menu menuPrincipal = new Menu(4, 100, 100, true);  
17:   //esse método vai desenhar na tela alguns possíveis cenários do nosso game  
18:   //lá em Menu.java cenario foi definido como -1  
19:   //se cenario == 0 muda a cor do fundo e mostra um texto  
20:   //se cenario == 1 muda a cor do fundo e mostra um texto  
21:   //se cenario == n muda a cor do fundo e mostra um texto...  
22:   //agora obser o nosso método desenharGraficos()  
23:   public void cenarios(){  
24:   Graphics bbg = backBuffer.getGraphics();  
25:   bbg.setFont(new Font("Arial",Font.BOLD,20));  
26:   if(menuPrincipal.cenario == 0){  
27:    bbg.setColor(new Color(255,100,100));  
28:    bbg.fillRect(0, 0, janelaW, janelaH);  
29:    bbg.setColor(Color.BLACK);  
30:    bbg.drawString("Você escolheu Jogar", 100, 200);  
31:    //aqui você pode escolher o que irá aparecer caso o usuario escolha essa item do menu!  
32:   }  
33:   if(menuPrincipal.cenario == 1){  
34:    bbg.setColor(new Color(100,255,100));  
35:    bbg.fillRect(0, 0, janelaW, janelaH);  
36:    bbg.setColor(Color.BLACK);  
37:    bbg.drawString("Você escolheu Opções", 100, 200);  
38:   }  
39:   if(menuPrincipal.cenario == 2){  
40:    bbg.setColor(new Color(100,100,255));  
41:    bbg.fillRect(0, 0, janelaW, janelaH);  
42:    bbg.setColor(Color.BLACK);  
43:    bbg.drawString("Você escolheu Ajuda", 100, 200);  
44:   }  
45:   if(menuPrincipal.cenario == 3){  
46:    System.exit(0);//esse comando fecha o nosso game!  
47:   }  
48:   }  
49:   public void atualizar() {  
50:   }  
51:   public void desenharGraficos() {  
52:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
53:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
54:   bbg.setColor(Color.WHITE);  
55:   bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO  
56:   menuPrincipal.desenharMenu();//isso desenhará nosso menu  
57:   cenarios();//isso irá desenhar os cenários que escolhermos no menu  
58:   //agora observe o método inicializar()  
59:   //==================================================================================  
60:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
61:   }  
62:   public void inicializar() {  
63:   setTitle("Titulo do Jogo!");  
64:   setSize(janelaW, janelaH);  
65:   setResizable(false);  
66:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
67:   setLayout(null);  
68:   setVisible(true);  
69:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
70:   //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS  
71:   addKeyListener(this);  
72:   //aqui definimos o texto de cada item do nosso menu  
73:   menuPrincipal.itens[0] = "Jogar";  
74:   menuPrincipal.itens[1] = "Opções";  
75:   menuPrincipal.itens[2] = "Ajuda";  
76:   menuPrincipal.itens[3] = "Sair";  
77:   //aqui fazemos o método desenhaMenu() que fica lá em Menu.java  
78:   //desenhar no nosso buffer  
79:   //.. agora para finalizar observe o método de evento keyPressed() mais abaixo...  
80:   menuPrincipal.bbg = backBuffer.getGraphics();  
81:   }  
82:   public void run() {  
83:   inicializar();  
84:   while (true) {  
85:    atualizar();  
86:    desenharGraficos();  
87:    try {  
88:     Thread.sleep(1000/FPS);  
89:    } catch (Exception e) {  
90:     System.out.println("Thread interrompida!");  
91:    }  
92:   }  
93:   }  
94:   public static void main(String[] args) {  
95:   Game game = new Game();  
96:   game.run();  
97:   }  
98:   public void keyPressed(KeyEvent e) {  
99:   //aqui, chamamos os métodos que irá controlar o menu pelo teclado  
100:   menuPrincipal.controlar(e);//esse controla o menu  
101:   menuPrincipal.voltarAoMenu(e);//esse faz voltar para o menu quando pressionarmos "Esc"  
102:   }  
103:   public void keyReleased(KeyEvent e) {  
104:   }  
105:   public void keyTyped(KeyEvent e) {  
106:   }  
107:  }  

Super simples! não é?
Observem como ficou o meu:




Até o nosso próximo tutorial!
Abraços e não deixem de comentar...

JAVA GAMES 2D::Eventos do Mouse::13

Olá pessoal!

Nesse tutorial iremos aprender uma das maneiras de como usar os Eventos  do Mouse, é muito semelhante ao tutorial anterior de Eventos do Teclado, para o nosso tutorial de hoje utilizaremos duas Interfaces: MouseListener e MouseMotionListener
(Criem um pacote tutorial13 no nosso projeto JAVAGAMES2D com o arquivo Game.java)
Muito bem....Vamos lá!
A primeira coisa a ser feita é implementar as interfaces na nossa Classe Game.java
1:  public class Game extends JFrame implements MouseListener, MouseMotionListener{  

Lembrem de adicionar a implementação dos métodos dessas interfaces, observem que podemos implementar quantas interfaces quisermos, bastando apenas separar por virgula, então é possível usar eventos de teclado e mouse num mesmo jogo...
Agora veja os método que serão implementados no final da Classe Game.java:

1:  @Override  
2:   public void mouseClicked(MouseEvent e) {  
3:   // TODO Auto-generated method stub  
4:   }  
5:   @Override  
6:   public void mouseEntered(MouseEvent e) {  
7:   // TODO Auto-generated method stub  
8:   }  
9:   @Override  
10:   public void mouseExited(MouseEvent e) {  
11:   // TODO Auto-generated method stub  
12:   }  
13:   @Override  
14:   public void mousePressed(MouseEvent e) {  
15:   // TODO Auto-generated method stub  
16:   }  
17:   @Override  
18:   public void mouseReleased(MouseEvent e) {  
19:   // TODO Auto-generated method stub  
20:   }  
21:   @Override  
22:   public void mouseDragged(MouseEvent e) {  
23:   // TODO Auto-generated method stub  
24:   }  
25:   @Override  
26:   public void mouseMoved(MouseEvent e) {  
27:   // TODO Auto-generated method stub  
28:   }  

Recomendo apagar esses comentários gerados (caso você tenha mandado gerar automaticamente), Muito bem... vamos lá....
Os métodos mouseMoved() e mouseDragged() são da interface MouseMotionsListener, e os outros métodos são de MouseListener,  bem... vejamos para quê serve cada um desses eventos:

mouseMoved(): é acionado todo vez que você mover o mouse.
mouseDragged(): é acionado toda vez que você clica segura e arrasta.

mouseReleased(): é acionado quando você libera o clique.
mousePressed(): é acionado no momento em quê o clique é pressionado e mantamos pressionado.
mouseExited(): é acionado quando o cursor é retirado de cima de um elemento.
mouseEntered(): é acionado quando o cursor ficar sobre um elemento.
mouseClicked(): é acionando quando clicamos com o mouse.

Agora a próxima etapa é adicionar um escutador para esses eventos no nosso JFrame dentro do método inicializar(),  se não adicionarmos esses escutadores nenhum desses métodos serão executados quando os eventos forem acionados (lembrando, o escutador é que manda executar esses métodos quando o evento for acionado).
Observe o código abaixo:

1:  public void inicializar() {  
2:   setTitle("Titulo do Jogo!");  
3:   setSize(janelaW, janelaH);  
4:   setResizable(false);  
5:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
6:   setLayout(null);  
7:   setVisible(true);  
8:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
9:   //AQUI ESTAMOS ADICIONANDO OS ESCUTADORES DE EVENTOS DO MOUSE  
10:   addMouseListener(this);  
11:   addMouseMotionListener(this);  
12:   }  

Muito simples! não é?
Agora vamos ver um exemplo de uso de eventos do mouse, no nosso exemplo iremos mover uma mira,  exibir as coordenadas do cursor no JFrame e quando clicarmos exibir uma mensagem!
(LEIAM OS COMENTÁRIOS DO CÓDIGO COM ATENÇÃO)

1:  import java.awt.*;  
2:  import java.awt.event.KeyEvent;  
3:  import java.awt.event.KeyListener;  
4:  import java.awt.event.MouseEvent;  
5:  import java.awt.event.MouseListener;  
6:  import java.awt.event.MouseMotionListener;  
7:  import java.awt.image.BufferedImage;  
8:  import java.io.File;  
9:  import javax.swing.ImageIcon;  
10:  import javax.swing.JFrame;  
11:  import javax.swing.JOptionPane;  
12:  public class Game extends JFrame implements MouseListener, MouseMotionListener{  
13:   BufferedImage backBuffer;  
14:   int FPS = 30;  
15:   int janelaW = 500;  
16:   int janelaH = 500;  
17:   //VARIAVEIS QUE VAMOS UTILIZAR  
18:   //UMA IMAGEM PARA REPRESENTAR A MIRA  
19:   //E AS SUAS COORDENADAS X e Y  
20:   //NÃO SE ESQUEÇA DE OLHAR O MÉTODO desenharGraficos()  
21:   //e os métodos de eventos que é onde iremos tratar algumas coisas  
22:   ImageIcon mira = new ImageIcon("src/tutor13/mira.png");  
23:   int xMira;  
24:   int yMira;  
25:   public void atualizar() {  
26:   }  
27:   public void desenharGraficos() {  
28:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
29:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
30:   bbg.setColor(Color.WHITE);  
31:   bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO  
32:   bbg.setColor(Color.RED);  
33:   bbg.setFont(new Font("helvica",Font.BOLD,20));  
34:   bbg.drawString("X=: "+xMira+" Y="+yMira, 50, 100); //EXIBE UM TEXTO + O VALOR DA TECLA PRESSIONADA  
35:   //QUE ESTÁ NA VARIÁVEL teclaPressionada  
36:   //AQUI DESENHAMOS A MIRA, O -25 É PARA FICAR CENTRALIZADA COM O CURSOR  
37:   bbg.drawImage(mira.getImage(), xMira-25, yMira-25, this);  
38:   //==================================================================================  
39:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
40:   }  
41:   public void inicializar() {  
42:   setTitle("Titulo do Jogo!");  
43:   setSize(janelaW, janelaH);  
44:   setResizable(false);  
45:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
46:   setLayout(null);  
47:   setVisible(true);  
48:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
49:   //AQUI ESTAMOS ADICIONANDO OS ESCUTADORES DE EVENTOS DO MOUSE  
50:   addMouseListener(this);  
51:   addMouseMotionListener(this);  
52:   }  
53:   public void run() {  
54:   inicializar();  
55:   while (true) {  
56:    atualizar();  
57:    desenharGraficos();  
58:    try {  
59:     Thread.sleep(1000/FPS);  
60:    } catch (Exception e) {  
61:     System.out.println("Thread interrompida!");  
62:    }  
63:   }  
64:   }  
65:   public static void main(String[] args) {  
66:   Game game = new Game();  
67:   game.run();  
68:   }  
69:   public void mouseClicked(MouseEvent e) {  
70:   JOptionPane.showMessageDialog(null, "Você clicou!!!!");  
71:   }  
72:   public void mouseEntered(MouseEvent e) {  
73:   }  
74:   public void mouseExited(MouseEvent e) {  
75:   }  
76:   public void mousePressed(MouseEvent e) {  
77:   }  
78:   public void mouseReleased(MouseEvent e) {  
79:   }  
80:   public void mouseDragged(MouseEvent e) {  
81:   }  
82:   public void mouseMoved(MouseEvent e) {  
83:   //AQUI X e Y DA MIRA RECEBE AS COORDENADAS DO CURSOR  
84:   xMira = e.getX();  
85:   yMira = e.getY();  
86:   }  
87:  }  

Veja como ficou:




Muito simples não é ?
Até o próximo tutorial!!! não deixem de comentar ou tirar duvidas! (assim que dé, respondo!!!)

JAVA GAMES 2D::Eventos do Teclado::12

Olá pessoal!

Nesse tutorial vamos mostrar uma maneira de como usar eventos do teclado para controlar algumas ações nos nossos jogos. é realmente muito simples fazer isso! tudo que iremos fazer é implementar uma Interface na nossa classe, reescrever os métodos abstratos dessa interface, e adicionar um escutador de teclas no nosso JFrame!
(Criem um pacote tutorial12 no nosso projeto JAVAGAMES2D com o arquivo Game.java)
Vamos lá!
1º passo implemente na Classe Game.java a seguinte Interface: KeyListiner
?
1
public class Game extends JFrame implements KeyListener{

Quando fizer isso salve as alterações, como eu uso o Eclipse ele vai acusar um erro, informando que eu preciso adicionar a implementação dos métodos da interface Keylistner, observe a figura abaixo:

agora vamos usar um truque do Eclipse, observe o x vermelho antes de public class, dê um clique sobre esse ícone, que irá aparecer o seguinte:

Agora basta dar um duplo clique  em Add unimplmented methods, para que o Eclipse adicione automaticamente essas linhas de código no final da classe Game.java

1:  @Override  
2:   public void keyPressed(KeyEvent e) {  
3:   // TODO Auto-generated method stub  
4:   }  
5:   @Override  
6:   public void keyReleased(KeyEvent e) {  
7:   // TODO Auto-generated method stub  
8:   }  
9:   @Override  
10:   public void keyTyped(KeyEvent e) {  
11:   // TODO Auto-generated method stub  
12:   }  

... O que temos ai é o seguinte: três métodos sem retorno (void), que recebe um parâmetro do tipo KeyEvent, (caso queiram apaguem esses comentários gerado pelo Eclipse)
//TODO Auto-generated method stub
@Override

Agora para finalizar vamos adicionar no nosso método inicializar() o escutador de teclas que é que vai acionar esses três métodos que foram criados toda vez que um evento de teclado for acionado!

1:  public void inicializar() {  
2:   setTitle("Titulo do Jogo!");  
3:   setSize(janelaW, janelaH);  
4:   setResizable(false);  
5:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
6:   setLayout(null);  
7:   setVisible(true);  
8:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
9:   //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS  
10:   addKeyListener(this);  
11:   }  

Falando brevemente sobre os três métodos criados:
O keyPressed é acionado no momento em que você pressiona a tecla e enquanto ela estiver pressionada
O keyReleased é acionado no momento em que você libera a tecla pressionada
O keyTyped é acionado toda vez que o usuário digitar um caractere em algum elemento que está com o foco!

Muito bem.... agora vamos ver um um bom exemplo, vamos exibir a tecla que o usuário pressionou e mover uma bola com as teclas direcionais....
(Leia os comentários com atenção!)

1:  import java.awt.*;  
2:  import java.awt.event.KeyEvent;  
3:  import java.awt.event.KeyListener;  
4:  import java.awt.image.BufferedImage;  
5:  import java.io.File;  
6:  import javax.swing.ImageIcon;  
7:  import javax.swing.JFrame;  
8:  public class Game extends JFrame implements KeyListener{  
9:   BufferedImage backBuffer;  
10:   int FPS = 30;  
11:   int janelaW = 500;  
12:   int janelaH = 500;  
13:   //VAMOS EXIBIR A TECLA PRESSIONADA  
14:   //E MOVER UMA BOLA COM AS DIRECIONAIS  
15:   //OBSER ISSO LÁ NO MÉTODO desenaharGraficos()  
16:   char teclaPressionada;  
17:   int xBola = 200;  
18:   int yBola = 200;  
19:   public void atualizar() {  
20:   }  
21:   public void desenharGraficos() {  
22:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
23:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
24:   bbg.setColor(Color.WHITE);  
25:   bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO  
26:   bbg.setColor(Color.RED);  
27:   bbg.setFont(new Font("helvica",Font.BOLD,20));  
28:   bbg.drawString("Você pressionou: "+teclaPressionada, 50, 100); //EXIBE UM TEXTO + O VALOR DA TECLA PRESSIONADA  
29:   //QUE ESTÁ NA VARIÁVEL teclaPressionada  
30:   //DESENHA UMA BOLA VERMELHA NA TELA  
31:   bbg.fillOval(xBola, yBola, 50, 50);  
32:   //AGORA VEJA O CÓDIGO DO MÉTODO keyPressed()  
33:   //LÁ VAMOS DIZER O QUE VAI ACONTECER QUANDO UM TECLA FOR PRESSIONADA!!!  
34:   //==================================================================================  
35:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
36:   }  
37:   public void inicializar() {  
38:   setTitle("Titulo do Jogo!");  
39:   setSize(janelaW, janelaH);  
40:   setResizable(false);  
41:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
42:   setLayout(null);  
43:   setVisible(true);  
44:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
45:   //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS  
46:   addKeyListener(this);  
47:   }  
48:   public void run() {  
49:   inicializar();  
50:   while (true) {  
51:    atualizar();  
52:    desenharGraficos();  
53:    try {  
54:     Thread.sleep(1000/FPS);  
55:    } catch (Exception e) {  
56:     System.out.println("Thread interrompida!");  
57:    }  
58:   }  
59:   }  
60:   public static void main(String[] args) {  
61:   Game game = new Game();  
62:   game.run();  
63:   }  
64:   //ESSES SÃO OS MÉTODOS DE EVENTOS DO TECLADO  
65:   public void keyPressed(KeyEvent e) {  
66:   //AQUI A VARIAVEL VAI RECEBER O VALOR UNICODE DA TECLA QUE O USUÁRIO PRESSIONAR!!!  
67:   teclaPressionada = e.getKeyChar();  
68:   //OBS: e.VK_ depois pressione ctrl+espaço para autocompletar!  
69:   //ai tem todas as teclas do teclado!!!  
70:   //SE A TECLA PRESSIONADA FOR LEFT = ESQUERDA xBola diminue 10  
71:   if(e.getKeyCode() == e.VK_LEFT){  
72:    xBola -= 10;  
73:   }  
74:   //SE A TECLA PRESSIONADA FOR RIGHT = DIREITA xBola aumenta 10  
75:   if(e.getKeyCode() == e.VK_RIGHT){  
76:    xBola += 10;  
77:   }  
78:   //SE A TECLA PRESSIONADA FOR UP = CIMA yBola diminue 10  
79:   if(e.getKeyCode() == e.VK_UP){  
80:    yBola -= 10;  
81:   }  
82:   //SE A TECLA PRESSIONADA FOR DOWN = BAIXO yBola aumenta 10  
83:   if(e.getKeyCode() == e.VK_DOWN){  
84:    yBola += 10;  
85:   }  
86:   }//FIM DO MÉTODO keyPressed()  
87:   public void keyReleased(KeyEvent e) {  
88:   }  
89:   public void keyTyped(KeyEvent e) {  
90:   }  
91:  }  

Muito bem.... vejam como ficou o meu:



Então é isso.... até o próximo tutorial, não deixem de comentar ou postar suas dúvidas aqui....

JAVA GAMES 2D::Colisão II::11

Olá pessoal!

No tutorial anterior vimos uma maneira de como verificar uma colisão simples. Nesse tutorial de hoje veremos uma outra forma de verificar se um objeto colidiu com outro, no método anterior não era apenas informado de que houve uma colisão, mas não era informado de qual lado do objeto que estava sendo colidido! Então sabendo qual lado do objeto está sendo tocado, é possível mandar o nosso objeto se comportar de uma maneira dependendo de onde ele foi tocado. Imagine um jogo de Corrida de Carros, caso o carro bata a sua lateral numa parede na pista, ele deve ser empurrado na direção oposta!
Muito bem.... então vamos ao que interessa: como é essa tal técnica? (ah lembrando que: o que tá sendo postado aqui, não são técnicas oficiais padrão! é a forma como eu faço e acho mais simples e funciona! pode ser feito diversas maneiras diferente! essa é epenas uma mera sugestão!)

A técnica é a seguinte: como no tutorial anterior nos iremos traçar os pontos(pontos imaginários... tá lá mais não tá!!!) de colisão no nosso objeto, ah! você pode traçar quantos pontos de colisão você quiser! dependendo do que se pretende fazer! ao ao colidir com com determinado ponto nosso objeto pode se comportar de uma maneira diferente!
Observe a imagem abaixo (ah! essas imagens são produzidas no Inkscape! sugiro estuda-las para usar na confecção do design dos seus games!)

Agora observe como o nosso código de colisão é simples, ele irá tratar de verificar a colisão de um único ponto!
?
1
2
3
4
5
6
7
public boolean colisao(int pontoX, int pontoY, int x, int y, int w, int h) {
  if ((pontoX >= x && pontoX <= x + w) && (pontoY >= y && pontoY <= y + h)) {
   return true;
  } else {
   return false;
  }
 }

Esse método trada de verificar a colisão de um único ponto!, etão você pode traçar quantos pontos imaginários quiser e verificar se o mesmo está colidindo em algum objeto!
colisao(x, y, x2, y2, w, h);

Abaixo segue o nosso exemplo do tutorial de hoje:

1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.swing.ImageIcon;  
5:  import javax.swing.JFrame;  
6:  public class Game extends JFrame {  
7:   BufferedImage backBuffer;  
8:   int FPS = 30;  
9:   int janelaW = 500;  
10:   int janelaH = 500;  
11:   // --------------------------------------------------------------------  
12:   // OBSERVEM ESSAS VÁRIÁVEIS (ISSO PODERIA SER ATRIBUTOS DE UMA CLASSE!)  
13:   // --------------------------------------------------------------------  
14:   int obj1X = 0; // COORDENADA X  
15:   int obj1Y = 225; // COORDENADA Y  
16:   int obj1W = 50; // LARGURA = Width  
17:   int obj1H = 50; // ALTURA = Height  
18:   boolean colidiuEsquerda = false;  
19:   boolean colidiuDireita = false;  
20:   boolean colidiuCima = false;  
21:   boolean colidiuBaixo = false;  
22:   int obj2X = 400;  
23:   int obj2Y = 200;  
24:   int obj2W = 50;  
25:   int obj2H = 50;  
26:   // --------------------------------------------------------------------  
27:   // ESSE MÉTODO VAI MOVER O OBJETO ATÉ A COORDENADA X = 500  
28:   // PARA QUE ELE TOQUE O OBJETO 2  
29:   // E A CADA VEZ QUE ELE CHEGAR NO FINAL DA TELA, VOLTA PRA O COMEÇO  
30:   // EM COM UMA NOVA COORDENADA Y ALEATÓRIA!!!  
31:   // --------------------------------------------------------------------  
32:   public void moveObjeto1() {  
33:   obj1X += 5;  
34:   if (obj1X > 500) {  
35:    obj1X = 0;  
36:    obj1Y = (int)(Math.random()*100)+150;  
37:   }  
38:   }  
39:   // --------------------------------------------------------------------  
40:   // SE O OBJETO COLEDIR EM UM DOS PONTOS, EXIBIRÁ UM TEXTO DIZENDO QUAL FOI TOCADO  
41:   // ESSE MÉTODO VAI SER CHAMANDO LÁ NO DENTRO DO MÉTODO desenharGraficos()  
42:   // --------------------------------------------------------------------  
43:   public void exibeTexto() {  
44:   Graphics bbg = backBuffer.getGraphics();  
45:   bbg.setColor(Color.RED);  
46:   if (colidiuEsquerda) {  
47:    bbg.drawString("COLISÃO: ESQUERDA!!!", 200, 110);  
48:   }  
49:   if (colidiuDireita) {  
50:    bbg.drawString("COLISÃO: DIREITA!!!", 200, 120);  
51:   }  
52:   if (colidiuCima) {  
53:    bbg.drawString("COLISÃO: CIMA!!!", 200, 130);  
54:   }  
55:   if (colidiuBaixo) {  
56:    bbg.drawString("COLISÃO: BAIXO!!!", 200, 140);  
57:   }  
58:   }  
59:   // --------------------------------------------------------------------  
60:   // ESSE É O NOSSO MÉTODO QUE VAI TRATAR A COLISÃO DE APENAS UM PONTO  
61:   // ESSE MÉTODO RECEBE COMO ARGUMENTO: X, Y DO PONTO E  
62:   //X,Y,W,H DO OBJETO ONDE VAI COLIDIR!  
63:   // --------------------------------------------------------------------  
64:   public boolean colisao(int pontoX, int pontoY, int x, int y, int w, int h) {  
65:   if ((pontoX >= x && pontoX <= x + w) && (pontoY >= y && pontoY <= y + h)) {  
66:    return true;  
67:   } else {  
68:    return false;  
69:   }  
70:   }  
71:   // --------------------------------------------------------------------  
72:   public void atualizar() {  
73:   //AQUI VAMOS VERIFICAR SE CADA PONTO ESTÁ SENDO TOCADO NO OBJETO 2  
74:   colidiuEsquerda = colisao(obj1X, obj1Y+obj1H/2, obj2X, obj2Y, obj2W, obj2H);  
75:   colidiuDireita = colisao(obj1X+obj1W, obj1Y+obj1H/2, obj2X, obj2Y, obj2W, obj2H);  
76:   colidiuCima = colisao(obj1X+obj1W/2, obj1Y, obj2X, obj2Y, obj2W, obj2H);  
77:   colidiuBaixo = colisao(obj1X+obj1W/2, obj1Y+obj1H, obj2X, obj2Y, obj2W, obj2H);  
78:   moveObjeto1();  
79:   }  
80:   public void desenharGraficos() {  
81:   Graphics g = getGraphics(); // ISSO JÁ ESTAVA AQUI  
82:   Graphics bbg = backBuffer.getGraphics();// ISSO TAMBÉM JÁ ESTAVA AQUI...  
83:   // ==================================================================================  
84:   bbg.setColor(Color.WHITE);  
85:   bbg.fillRect(0, 0, janelaW, janelaH);// DESENHA UM FUNDO BRANCO NA TELA!  
86:   // EXIBE UM TEXTO CASO O OBJETO COLIDA!  
87:   exibeTexto();  
88:   // DESENHA O OBJETO 2  
89:   bbg.setColor(Color.BLUE);  
90:   bbg.fillRect(obj2X, obj2Y, obj2W, obj2H);  
91:   // DESENHA O OBJETO 1 //com transparência  
92:   // new Color(red,green, blue, alpha) o alpha é o valor da trasnparência  
93:   // vai de 0 à 255  
94:   bbg.setColor(new Color(0, 255, 0, 200));  
95:   bbg.fillRect(obj1X, obj1Y, obj1W, obj1H);  
96:   // ==================================================================================  
97:   g.drawImage(backBuffer, 0, 0, this);// OBS: ISSO DEVE FICAR SEMPRE NO  
98:        // FINAL!  
99:   }  
100:   public void inicializar() {  
101:   setTitle("Tutorial 11 Colisão!");  
102:   setSize(janelaW, janelaH);  
103:   setResizable(false);  
104:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
105:   setLayout(null);  
106:   setVisible(true);  
107:   backBuffer = new BufferedImage(janelaW, janelaH,  
108:    BufferedImage.TYPE_INT_RGB);  
109:   }  
110:   public void run() {  
111:   inicializar();  
112:   while (true) {  
113:    atualizar();  
114:    desenharGraficos();  
115:    try {  
116:    Thread.sleep(1000 / FPS);  
117:    } catch (Exception e) {  
118:    System.out.println("Thread interrompida!");  
119:    }  
120:   }  
121:   }  
122:   public static void main(String[] args) {  
123:   Game game = new Game();  
124:   game.run();  
125:   }  
126:  }  

(leiam atentamente os comentários do código!)
Muito simples não é pessoal ?
Vejam como ficou o meu:





Muito bem!!!.... até o próximo tutorial!!!

JAVA GAMES 2D::Colisão I::10

Olá pessoal!

No tutorial de hoje iremos ver uma maneira de como testar uma colisão simples entre dois objetos! existe várias formas de testar uma colisão como: verificar se o objeto tocou a extremidade do outro, verificar se eles estão se intersectando, ou se ambos tem a mesma coordenada X e , e após constatar a colisão iremos dizer como esses objetos irão se comportar durante a colisão!
Vamos ver uma maneira de verificar essas colisões com um único método! então vamos lá! crie um pacote chamado tutorial10 no nosso projeto JAVAGAMES2D, e cole no pacote o nosso template pra jogos Game.java!

Agora observe o código abaixo (leita atentamente os comentários no código):

1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.swing.ImageIcon;  
5:  import javax.swing.JFrame;  
6:  public class Game extends JFrame {  
7:   BufferedImage backBuffer;  
8:   int FPS = 30;  
9:   int janelaW = 500;  
10:   int janelaH = 500;  
11:   // --------------------------------------------------------------------  
12:   // OBSERVEM ESSAS VÁRIÁVEIS (ISSO PODERIA SER ATRIBUTOS DE UMA CLASSE!)  
13:   // --------------------------------------------------------------------  
14:   int obj1X = 0; // COORDENADA X  
15:   int obj1Y = 225; // COORDENADA Y  
16:   int obj1W = 50; // LARGURA = Width  
17:   int obj1H = 50; // ALTURA = Height  
18:   boolean objeto1Colediu = false;  
19:   int obj2X = 400;  
20:   int obj2Y = 200;  
21:   int obj2W = 50;  
22:   int obj2H = 50;  
23:   // --------------------------------------------------------------------  
24:   // ESSE MÉTODO VAI MOVER O OBJETO ATÉ A COORDENADA X = 390  
25:   // PARA QUE ELE TOQUE O OBJETO 2  
26:   // MAS NÃO IMPORTA COMO ELE SE MOVA, UM MÉTODO VAI TRATAR DE  
27:   // VERIFICAR SE OUVE COLISÃO OU NÃO!  
28:   // --------------------------------------------------------------------  
29:   public void moveObjeto1() {  
30:   obj1X += 2;  
31:   if (obj1X > 500) {  
32:    obj1X = 0;  
33:   }  
34:   }  
35:   // --------------------------------------------------------------------  
36:   // SE O OBJETO COLEDIR APARECERÁ UM TEXTO INFORMANDO!!!  
37:   // ESSE MÉTODO VAI SER CHAMANDO LÁ NO DENTRO DO MÉTODO desenharGraficos()  
38:   // --------------------------------------------------------------------  
39:   public void exibeTexto() {  
40:   Graphics bbg = backBuffer.getGraphics();  
41:   if (objeto1Colediu) {  
42:    bbg.setColor(Color.RED);  
43:    bbg.drawString("UIII fui tocado!!!", 200, 100);  
44:   }  
45:   }  
46:   // --------------------------------------------------------------------  
47:   // ESSE É O NOSSO MÉTODO QUE VAI TRATAR A COLISÃO  
48:   // ESSE MÉTODO RECEBE COMO ARGUMENTO: X, Y, W, H do Obj1 e Obj2  
49:   // NÃO SE PREOCUPE NOS VAMOS EXPLICAR ESSA LAVAGEM DE CÓDIGO!!!  
50:   // --------------------------------------------------------------------  
51:   public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,  
52:    int obj2X, int obj2Y, int obj2W, int obj2H) {  
53:   if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
54:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
55:    return true;  
56:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
57:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
58:    return true;  
59:   } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
60:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
61:    return true;  
62:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
63:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
64:    return true;  
65:   } else {  
66:    return false;  
67:   }  
68:   }  
69:   // --------------------------------------------------------------------  
70:   public void atualizar() {  
71:   objeto1Colediu = colisao(obj1X, obj1Y, obj1W, obj1H, obj2X, obj2Y,  
72:    obj2W, obj2H);  
73:   moveObjeto1();  
74:   }  
75:   public void desenharGraficos() {  
76:   Graphics g = getGraphics(); // ISSO JÁ ESTAVA AQUI  
77:   Graphics bbg = backBuffer.getGraphics();// ISSO TAMBÉM JÁ ESTAVA AQUI...  
78:   // ==================================================================================  
79:   bbg.setColor(Color.WHITE);  
80:   bbg.fillRect(0, 0, janelaW, janelaH);// DESENHA UM FUNDO BRANCO NA TELA!  
81:   // EXIBE UM TEXTO CASO O OBJETO COLIDA!  
82:   exibeTexto();  
83:   // DESENHA O OBJETO 2  
84:   bbg.setColor(Color.BLUE);  
85:   bbg.fillRect(obj2X, obj2Y, obj2W, obj2H);  
86:   // DESENHA O OBJETO 1 //com transparência  
87:   // new Color(red,green, blue, alpha) o alpha é o valor da trasnparência  
88:   // vai de 0 à 255  
89:   bbg.setColor(new Color(0, 255, 0, 200));  
90:   bbg.fillRect(obj1X, obj1Y, obj1W, obj1H);  
91:   // ==================================================================================  
92:   g.drawImage(backBuffer, 0, 0, this);// OBS: ISSO DEVE FICAR SEMPRE NO  
93:        // FINAL!  
94:   }  
95:   public void inicializar() {  
96:   setTitle("Tutorial 10 Colisão simples!");  
97:   setSize(janelaW, janelaH);  
98:   setResizable(false);  
99:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
100:   setLayout(null);  
101:   setVisible(true);  
102:   backBuffer = new BufferedImage(janelaW, janelaH,  
103:    BufferedImage.TYPE_INT_RGB);  
104:   }  
105:   public void run() {  
106:   inicializar();  
107:   while (true) {  
108:    atualizar();  
109:    desenharGraficos();  
110:    try {  
111:    Thread.sleep(1000 / FPS);  
112:    } catch (Exception e) {  
113:    System.out.println("Thread interrompida!");  
114:    }  
115:   }  
116:   }  
117:   public static void main(String[] args) {  
118:   Game game = new Game();  
119:   game.run();  
120:   }  
121:  }  

Muito bem... Agora vamos entender o método colisão que é o que está menos comentado no nosso código acima....
Observe a seguinte imagem:



Muito bem... temos um quadrado, e nesse quadrado temos quatro pontos (marcado de vermelho), cada ponto possui uma coordenada X e Y, conhecendo apenas as coordenadas e dimensões do nosso quadrado é possível deduzir as coordenadas de cada um desses quatro pontos, como mostra o circulo laranja... "blz... entendi... o que devemos fazer agora...?"
agora vamos verificar se cada um desses pontos está invadindo a área de outro objeto (quadrado...)
Observe a imagem abaixo:
Para verificar se cada ponto do Objeto1 está dentro do Objeto2, temos que fazer algumas verificações como mostra o circulo laranja, Observe o nosso ponto P, as coordenadas X do nosso ponto P em relação ao Objeto2 tem que ser: X de P >= X do Objeto 2 e ao mesmo tempo o X de P <= X+largura do Objeto 2 ..... E ao mesmo tempo Y de P >= Y do Objeto 2 e ao mesmo tempo o Y de P <= Y+altura do Objeto 2.
Então essas condições tem que ser verificadas para cada um dos nossos pontos 1, 2, 3 e 4! Observe novamente o nosso método colisao()
1:  public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,  
2:    int obj2X, int obj2Y, int obj2W, int obj2H) {  
3:   if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
4:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
5:    return true;  
6:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
7:    && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {  
8:    return true;  
9:   } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)  
10:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
11:    return true;  
12:   } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)  
13:    && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {  
14:    return true;  
15:   } else {  
16:    return false;  
17:   }  
18:   }  

Então perceba que se um dos nossos pontos invadir o outro objeto, o nosso método irá retornar TRUE

Observe também que o nosso método foi chamado dentro do método atualizar, então estará sendo verificado o tempo inteiro se está havendo colisão ou não, caso haja uma colisão o nosso método retorna TRUE caso não retorna FALSE. esse valor será retornado para uma variável, caso ela receba true, um texto será exibido na tela!!!
(Estudem o código atentamente!!!)
Observem como ficou o meu:

Até o nosso próximo tutorial!!!

JAVA GAMES 2D::Movimentando Objetos::09

Olá pessoal!

Nesse tutorial de hoje, irei mostrar como fazer para um objeto se mover sozinho nos nosso games! existe várias formas de se fazer isso, e dependendo do que se deseja o código pode vir a se tornar complexo, usarei como exemplo o código do tutorial anterior (Animando Sprites), então sugiro que faça o seguinte, criem um novo pacote chamado tutorial9 dentro do nosso projeto JAVAGAMES2D, cole nele tudo que está no pacote tutorial8 e vamos fazer umas pequenas modificações tal como a do código abaixo:
1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.swing.ImageIcon;  
5:  import javax.swing.JFrame;  
6:  public class Game extends JFrame {  
7:   BufferedImage backBuffer;  
8:   int FPS = 30;  
9:   int janelaW = 500;  
10:   int janelaH = 500;  
11:   //EU REMOVI O VILÃO 2 QUE TINHA AQUI...  
12:   //E MUDEI A IMAGEM DO FUNDO, MAS ISSO É UM MERO DETALHE!!!  
13:   Sprite vilao = new Sprite(3, 200, 300);  
14:   ImageIcon fundo = new ImageIcon("src/tutor9/fundo.jpg");  
15:   boolean vai = true; //ESSA VARIÁVEL PODERIA ESTAR NA CLASSE Sprite  
16:   boolean volta = false; //ESSA VARIÁVEL PODERIA ESTAR NA CLASSE Sprite  
17:   //TENTE ENTENDER O CÓDIGO ABAIXO:  
18:   //ESSE MÉTODO SERÁ RESPONSÁVEL POR FAZER O OBJETO IR E VOLTAR  
19:   //ESSE MÉTODO TAMBÉM PODERIA ESTAR NA CLASSE SPRITE!!!  
20:   //DEPENDENDO DO QUE SE PRETENDER FAZER, ESSE MÉTODO PODERIA SER MAIS COMPLEXO!!  
21:   public void mover(){  
22:   if(vai){ vilao.x += 5; }  
23:   if(volta){ vilao.x -= 5; }  
24:   if(vilao.x>400){ vai = false; volta = true; }  
25:   if(vilao.x<100){ vai = true; volta = false; }  
26:   }  
27:   //AGORA DEVEMOS CHAMAR ESSE MÉTODO AQUI  
28:   //PARA QUE ELE SEJA EXECUTADO O TEMPO INTEIRO  
29:   public void atualizar() {  
30:   mover();//AQUI CHAMAMOS O MÉTODO MOVER!  
31:   }  
32:   public void desenharGraficos() {  
33:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
34:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
35:   //AQUI VAMOS MANDAR DESENHAR ALGUNS IMAGENS NA TELA  
36:   bbg.drawImage(fundo.getImage(),0,0,500,500,this);//QUI DESENHAMOS O FUNDO  
37:   //AS DIMENSÕES ORIGINAIS DO FUNDO SÃO: 500X500 QUE É O TAMANHO DA NOSSA TELA!  
38:   bbg.drawImage(vilao.cenas[vilao.cena].getImage(), vilao.x, vilao.y,this);  
39:   vilao.animar();  
40:   //==================================================================================  
41:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
42:   }  
43:   public void inicializar() {  
44:   setTitle("Titulo do Jogo!");  
45:   setSize(janelaW, janelaH);  
46:   setResizable(false);  
47:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
48:   setLayout(null);  
49:   setVisible(true);  
50:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
51:   vilao.cenas[0] = new ImageIcon("src/tutor8/s1.gif");  
52:   vilao.cenas[1] = new ImageIcon("src/tutor8/s2.gif");  
53:   vilao.cenas[2] = new ImageIcon("src/tutor8/s3.gif");  
54:   }  
55:   public void run() {  
56:   inicializar();  
57:   while (true) {  
58:    atualizar();  
59:    desenharGraficos();  
60:    try {  
61:     Thread.sleep(1000/FPS);  
62:    } catch (Exception e) {  
63:     System.out.println("Thread interrompida!");  
64:    }  
65:   }  
66:   }  
67:   public static void main(String[] args) {  
68:   Game game = new Game();  
69:   game.run();  
70:   }  
71:  }  
Muito bem.... então basicamente criamos um método que modifica os valores das coordenadas X e Y da nossa Sprite! dependendo do que se pretende fazer o método poderia ficar mais complexo! você iria detalhar como ele iria se comportar! é um exemplo bem básico (ele vai e volta!!!)... mas já dá para  compreender como funciona + ou -, e começar a terem ideias (implementem também e compartilhem o link nos comentários)!!!
Olhe como ficou o meu:
Viu como é simples! Até o próximo tutorial!

JAVA GAMES 2D::Animando Sprites::08

Olá pessoal!

Nesse tutorial mostrarei como animar Sprites, não é nenhuma técnica padrão oficial de como fazer, é uma ideia minha de como animar um sprite! cada um pode fazer conforme achar melhor!
Então vamos lá pra que não sabe Sprite é cada cena que representa os estados de um personagem em um jogo 2D, segue um exemplo abaixo:

Então caso você queira fazer um game estilo Mortal Kombate, você teria que ter uma sequência de imagens que representasse todos os seus movimentos, como: andar para direita, esquerda, pular, soco alto, soco baixo, chute alto, chute baixo, poderes, fatality, combos, etc!
O que nós vamos fazer é o seguinte: Animar o Sprite, pra quem não sabe uma animação consiste em uma sequencia de imagens que é exibida uma por vez em um curto intervalo de tempo que não é percebível a troca das mesmas, assim dá uma impressão de que está se movendo!
Nesse exemplo de hoje, iremos fazer uso de uma outra Classe além da classe Game.java, vamos então criar um pacote chamado tutorial8 dentro do nosso projeto JAVAGAMES2D e colar o Game.java dentro desse pacote, nesse mesmo pacote, criaremos uma Classe chamada Sprite.java com o seguinte código:
 
1:  import javax.swing.ImageIcon;  
2:  public class Sprite {  
3:   ImageIcon cenas[]; //VETOR DE IMAGENS,  
4:   int x;   //AQUI É A COORDENADA X  
5:   int y;   //AQUI É A COORDENADA Y  
6:   int largura;  //LARGURA DA IMAGEM, CASO QUEIRA DEFINIR UMA  
7:   int altura;  //ALTURA DA IMAGEM, CASO QUEIRA DEFINIR UMA  
8:   int cena = 0;  //O INDICE DA CENA DA NOSSA SPRITE ANIMADA  
9:   int controlaVelocidade = 0;  
10:   int velocidade = 5;  
11:   //ISSO AQUI EM BAIXO PRA QUEM NÃO SABE É UM CONSTRUTOR  
12:   //QUANDO FORMOS CRIAR UM OBJETO A PARTIR DESSA CLASSE  
13:   //TEREMOS QUE: INFORMAR O NÚMERO DE CENAS, E A SUA COORDENADA INICIAL  
14:   //+ OU - ASSIM: new Sprite(3, 200, 300);  
15:   public Sprite(int numeroDeCenas, int x, int y){  
16:   cenas = new ImageIcon[numeroDeCenas];  
17:   this.x = x;  
18:   this.y = y;  
19:   }  
20:   //ESSE MÉTODO VAI ALTERNAR AS IMAGENS QUE COMPÕES NOSSA SPRITE  
21:   //DEPENDENDO DO QUE VC PRETENDER FAZER, ESSE MÉTODO PODERIA  
22:   //SER MAIS COMPLEXO!  
23:   //TIPO: animarCorrer() animarChutar() animarPular()  
24:   //E ESSES MÉTODOS SERIAM CHAMADOS AO CLICAR EM ALGUMA TECLA!!!  
25:   //ESSA ANIMAÇÃO VAI FICAR MUITO RÁPIDA, PQ ELE MUDAR A IMAGEM DA CENA  
26:   //A CADA 1/30 milissegundos  
27:   public void animar(){  
28:   cena += 1;  
29:   if(cena == cenas.length){ cena = 0; }  
30:   }  
31:   //ESSE MÉTODO CONTROLA A VELOCIDADE DA ANIMAÇÃO  
32:   //TENTEN ENTENDER ISSO AI...:  
33:   //isso é um controle de tempo paralelo ao que já tem no game loop!!!!  
34:   //o game loop vai rodar isso 30x a cada segundo  
35:   //e esse método vai mudar a cena a cada, 5 vezes que o game loop for  
36:   //executado!!!!  
37:   public void animarMaisLento(){  
38:   controlaVelocidade+=1;  
39:   if(controlaVelocidade>velocidade){  
40:    cena += 1;  
41:    controlaVelocidade = 0;  
42:    if(cena == cenas.length){ cena = 0; }  
43:   }  
44:   }  
45:  }  

Muito bem... nosso arquivo Game.java vai ficar assim:
(leiam atentamente os comentários.... deixei tudo explicado neles!!!)

1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.swing.ImageIcon;  
5:  import javax.swing.JFrame;  
6:  public class Game extends JFrame {  
7:   BufferedImage backBuffer;  
8:   int FPS = 30;  
9:   int janelaW = 500;  
10:   int janelaH = 500;  
11:   //ESSA É A NOSSA SPRITE!  
12:   //VERIFIQUE AGORA O MÉTODO inicializar()  
13:   //LÁ VAMOS INICIAR AS IMAGENS QUE VAMOS USAR NESSA SPRITE!  
14:   //DEPOIS VERIFIQUE O MÉTODO desenharGraficos()  
15:   //VEJA QUE ESSA SPRITE TEM 3 CENAS!!!  
16:   Sprite vilao = new Sprite(3, 200, 300);  
17:   Sprite vilao2 = new Sprite(3, 100, 200);  
18:   ImageIcon fundo = new ImageIcon("src/tutor6/fundo.png");  
19:   public void atualizar() {  
20:   }  
21:   public void desenharGraficos() {  
22:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
23:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
24:   //AQUI VAMOS MANDAR DESENHAR ALGUNS IMAGENS NA TELA  
25:   bbg.drawImage(fundo.getImage(),0,0,this);//QUI DESENHAMOS O FUNDO  
26:   //AS DIMENSÕES ORIGINAIS DO FUNDO SÃO: 500X500 QUE É O TAMANHO DA NOSSA TELA!  
27:   //AQUI TO DESENHANDO A O NOSSO PERSONAGEM  
28:   //VEJA QUE NOSSO vilão tem tudo que agente precisa!  
29:   //SUAS COORDENADAS, LARGURA, ALTURA, E AS IMAGENS!!!  
30:   bbg.drawImage(vilao.cenas[vilao.cena].getImage(), vilao.x, vilao.y, this);  
31:   vilao.animar(); //AQUI CHAMEI O MÉTODO ANIMAR  
32:   bbg.drawImage(vilao2.cenas[vilao2.cena].getImage(), vilao2.x, vilao2.y, this);  
33:   vilao2.animarMaisLento(); //AQUI CHAMEI O MÉTODO ANIMAR MAIS LENTO  
34:   //==================================================================================  
35:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
36:   }  
37:   public void inicializar() {  
38:   setTitle("Titulo do Jogo!");  
39:   setSize(janelaW, janelaH);  
40:   setResizable(false);  
41:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
42:   setLayout(null);  
43:   setVisible(true);  
44:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
45:   //QUI CARREGAMOS AS IMAGENS DE NOSSA SPIRTE!!!!!!!  
46:   //PARA O VETOR DE ImageIcon[] !!!  
47:   vilao.cenas[0] = new ImageIcon("src/tutor8/s1.gif");  
48:   vilao.cenas[1] = new ImageIcon("src/tutor8/s2.gif");  
49:   vilao.cenas[2] = new ImageIcon("src/tutor8/s3.gif");  
50:   vilao.largura = 100; //LARGURA DO VILÃO  
51:   vilao.altura = 200; //ALTURA DO VILÃO , mas não vou usar isso agora..  
52:   //QUI CARREGAMOS AS IMAGENS DE NOSSA SPIRTE!!!!!!!  
53:   //PARA O VETOR DE ImageIcon[] !!!  
54:   vilao2.cenas[0] = new ImageIcon("src/tutor8/s1.gif");  
55:   vilao2.cenas[1] = new ImageIcon("src/tutor8/s2.gif");  
56:   vilao2.cenas[2] = new ImageIcon("src/tutor8/s3.gif");  
57:   vilao2.largura = 100; //LARGURA DO VILÃO  
58:   vilao2.altura = 200; //ALTURA DO VILÃO , mas não vou usar isso agora..  
59:   }  
60:   public void run() {  
61:   inicializar();  
62:   while (true) {  
63:    atualizar();  
64:    desenharGraficos();  
65:    try {  
66:     Thread.sleep(1000/FPS);  
67:    } catch (Exception e) {  
68:     System.out.println("Thread interrompida!");  
69:    }  
70:   }  
71:   }  
72:   public static void main(String[] args) {  
73:   Game game = new Game();  
74:   game.run();  
75:   }  
76:  }  

novamente lembrando que está disponível para download no link acima!!!
o meu ficou assim:




então era isso pessoal.... até o próximo tutorial!!!

JAVA GAMES 2D::Sons MIDI::07

Olá pessoal!
No tutorial de hoje iremos aprender como tocar arquivos de áudio do tipo MIDI (Musical Instrument Digital Interface)!!! É bem interessante usar esse tipo de arquivo de áudio, facilmente vocês irão encontrar por ai programas para compor melodias e salvar no formato .mid, sugiro que baixem ai algum teclado virtual que dê suporte a este recurso, ou pesquisem e baixe por aí sons já prontos! (são muito pequenos e rápido de baixar!!!), exite formas de tocar formatos diferentes de áudio como .mp3, .au, .wav, mas não será tema desse tutorial!




Então vamos lá!
Para tocar um arquivo de áudio .mid, a primeira coisas que iremos precisar é de um arquivo de áudio do tipo .mid!!!


Depois iremos precisar de um objeto do tipo Sequence para carregar dentro dele o arquivo que iremos tocar, e de um objeto do tipo Sequencer, ele é que irá tocar nossas sequences!
Nosso exercício de hoje será o seguinte: crie um pacote chamado tutoria7 dentro do nosso projeto JAVAGAMES2D, cole dentro do pacote o arquivo Game.java, do pacote tutorial3 que é o nosso template!
Agora nós vamos declarar nosso Sequencer (tocador) e Sequence (música), e em seguida iremos criar um método para tocar a trilha sonora de nossos games!
(Nota: ao declarar o Sequencer e Sequence lembre de importar! use o autoplete que será feito automático! Ctrl+Barra de espaço)
Abaixo segue o código:
1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.sound.midi.MidiSystem;  
5:  import javax.sound.midi.Sequence;  
6:  import javax.sound.midi.Sequencer;  
7:  import javax.swing.ImageIcon;  
8:  import javax.swing.JFrame;  
9:  public class Game extends JFrame {  
10:   BufferedImage backBuffer;  
11:   int FPS = 30;  
12:   int janelaW = 500;  
13:   int janelaH = 500;  
14:   Sequencer player; //ESSE É O NOSSO TOCADOR  
15:   String musica1 = "src/tutor7/batalha.mid"; //ISSO É SÓ A URL DA NOSSA MÚSICA  
16:   String musica2 = "src/tutor7/campo.mid"; //ISSO AQUI TAMBÉM É OUTRA URL  
17:   public void tocarMusica(String nome, int repetir){  
18:   try{  
19:    player = MidiSystem.getSequencer(); //INICIA O TOCADOR  
20:    Sequence musica = MidiSystem.getSequence(new File(nome));//CARREGA A MÚSICA A SER TOCADA  
21:    player.open(); //ABRE O TOCADOR  
22:    player.setSequence(musica); //PASSA A MÚSICA QUE VAI SER TOCADA PARA O TOCADOR  
23:    player.setLoopCount(repetir); //DEFINE QUANTAS VEZES VAI TOCAR A MÚSICA OBS: 0 = 1 vez; 1 = 2 vezes; 2 = 3 vezes...  
24:    player.start(); //COMEÇA A TOCAR.... CASO QUEIRA PARAR DE TOCAR A MÚSICA BASTA: player.stop();  
25:   }catch(Exception e){  
26:    System.out.println("Erro ao tocar: "+nome);  
27:   }  
28:   }  
29:   public void atualizar() {  
30:   }  
31:   public void desenharGraficos() {  
32:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
33:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
34:   //AQUI VAMOS MANDAR DESENHAR ALGUNS IMAGENS NA TELA  
35:   //==================================================================================  
36:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
37:   }  
38:   public void inicializar() {  
39:   setTitle("Titulo do Jogo!");  
40:   setSize(janelaW, janelaH);  
41:   setResizable(false);  
42:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
43:   setLayout(null);  
44:   setVisible(true);  
45:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
46:   //===========================================================================  
47:   //========== É AQUI QUE EU TO CHAMANDO O MÉTODO tocarMusica()================  
48:   tocarMusica(musica1, 999); //CHAMAMOS O TOCADOR DENTRO DO MÉTODO inicializar()  
49:   //ENTÃO AO INICAR O GAME, ESSA SERÁ A NOSSA MÚSICA DE FUNDO  
50:   //===========================================================================  
51:   }  
52:   public void run() {  
53:   inicializar();  
54:   while (true) {  
55:    atualizar();  
56:    desenharGraficos();  
57:    try {  
58:     Thread.sleep(1000/FPS);  
59:    } catch (Exception e) {  
60:     System.out.println("Thread interrompida!");  
61:    }  
62:   }  
63:   }  
64:   public static void main(String[] args) {  
65:   Game game = new Game();  
66:   game.run();  
67:   }  
68:  }  

Muito bem.... vamos entender alguns pontos...  o método tocarMusica() que criamos vai receber 2 argumentos o nome da música e o número de vezes que ela se repetirá, só reforçando, se você passar 0 (zero) ele vai tocar 1 vez, se você passar 1(um) ele vai tocar 2... então ele vai tocar (n+1) vezes!!!!
Caso você queira tocar um som de um BIP ao clicar, basta chamar o método tocarMusica() dentro do evento de click (estudaremos sobre eventos mais adiante...), outro exemplo, caso você queira emitir um som de tiro em um jogo de nave, basta chamar o mesmo método quando for disparar o tipo, finalizando.... você pode usar o mesmo método para tocar qualquer parte da trilha sonora dos nossos games!!!

(executem aí para ouvir o som tocando!!!)

Então é isso ai pessoal! finalizamos mais um tutorial, testem esse exemplo ai, lembrando que está disponível para download no link acima!
Até o próximo!!

JAVA GAMES 2D::Imagens::06

Olá pessoal!
Nesse tutorial, vamos aprender como desenhar imagens (PNG GIF JPG) nas telas de nossos games! é bem legal usar imagens para construir games, eles ficam com um design mais chamativo, e dá menos trabalho que desenhar com usando a Classe geom que vimos nos tutoriais anteriores... recomendo que aprendam a usar alguma ferramenta de desenhos em VETOR (indico o Inkscape ou CorelDraw) e outra ferramente para tratar imagens (indico o Gimp ou Photoshop), mas use o de sua preferência, estarei usando o Inkscape e Gimp em alguns dos exemplos que irei postar ainda... (pegar algumas no google também! \(^_^)/  )...

Muito bem... o primeiro passo para desenhar imagens na tela é ter uma variável do tipo imagem, e carregar uma imagem para essa variável!
(lembrando ao declarar uma variavel do tipo ImageIcon devemos importar essa classe primeir, o Eclipse importa automaticamente para mim, quando uso o autocomplete)

1:  ImageIcon abelha = new ImageIcon("src/pacote/imagem.png");  


Lembre de usar imagens com fundo transparente quando for desenhar a Sprite de algum personagem para seu jogo!

Novamente crie um pacote chamado tutorial6 dentro do projeto JAVAGAMES2D, cole lá a classe Game.java que deixamos como modelo, salve uma imagem de sua preferência nesse mesmo pacote (ah! ou baixe o exemplo pronto no link acima!!!)

Olhe como via ficar o nosso código:
(no inicio declaramos a variável abelha e mandamos desenhar no método desenharGraficos() )

1:  import java.awt.*;  
2:  import java.awt.image.BufferedImage;  
3:  import java.io.File;  
4:  import javax.swing.ImageIcon;  
5:  import javax.swing.JFrame;  
6:  public class Game extends JFrame {  
7:   BufferedImage backBuffer;  
8:   int FPS = 30;  
9:   int janelaW = 500;  
10:   int janelaH = 500;  
11:   ImageIcon abelha = new ImageIcon("src/tutor6/bee.png");  
12:   ImageIcon fundo = new ImageIcon("src/tutor6/fundo.png");  
13:   public void atualizar() {  
14:   }  
15:   public void desenharGraficos() {  
16:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
17:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
18:   //AQUI VAMOS MANDAR DESENHAR ALGUNS IMAGENS NA TELA  
19:   bbg.drawImage(fundo.getImage(),0,0,this);//QUI DESENHAMOS O FUNDO  
20:   //AS DIMENSÕES ORIGINAIS DO FUNDO SÃO: 500X500 QUE É O TAMANHO DA NOSSA TELA!  
21:   //DESENHANDO A ABELHA NAS COORDENADAS X=200 e Y=200  
22:   bbg.drawImage(abelha.getImage(),200,200,this); //aqui fica com as dimensões originais!  
23:   //AQUI DEFINI A LARGURA E ALTURA DA IMAGEM  
24:   bbg.drawImage(abelha.getImage(),100,100,40,40,this); //aqui não fica com as dimensões originais!  
25:   //AQUI VAMOS ROTACIONAR A IMAGEM EM 45º  
26:   //PARA ISSO VAMOS USAR OUTRA VARIAVEL DO TIPO Graphics2D  
27:   //SE NÃO usarmos outra variável tudo que tá no buffer será rotacionado também!  
28:   Graphics2D bbg2d = (Graphics2D) backBuffer.getGraphics();//AQIU É NOSSA OUTRA VÁRIAVEL!  
29:   //para rotacionar primeiro define o eixo (isso desloca a imagem, então depois temos que desfazer)  
30:   //vou por o exito no meio, então é só dividir a altura e largura da imagem por 2  
31:   bbg2d.translate((abelha.getIconWidth()/2)+300, (abelha.getIconHeight()/2)+300); //tem que desfazer isso depois que a imagem será deslocada!  
32:   bbg2d.rotate(45*(Math.PI/180)); //vamos calcular 45º  
33:   bbg2d.translate(-((abelha.getIconWidth()/2)+300), -((abelha.getIconHeight()/2)+300));// agora desfaz o négocio do exito!!!  
34:   //veja que eu passei os mesmos valores só que negativos, ovserve o sinal de "-" menos  
35:   bbg2d.drawImage(abelha.getImage(),300,300,this); //desenha a imagem  
36:   //==================================================================================  
37:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
38:   }  
39:   public void inicializar() {  
40:   setTitle("Titulo do Jogo!");  
41:   setSize(janelaW, janelaH);  
42:   setResizable(false);  
43:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
44:   setLayout(null);  
45:   setVisible(true);  
46:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
47:   }  
48:   public void run() {  
49:   inicializar();  
50:   while (true) {  
51:    atualizar();  
52:    desenharGraficos();  
53:    try {  
54:     Thread.sleep(1000/FPS);  
55:    } catch (Exception e) {  
56:     System.out.println("Thread interrompida!");  
57:    }  
58:   }  
59:   }  
60:   public static void main(String[] args) {  
61:   Game game = new Game();  
62:   game.run();  
63:   }  
64:  }  

Muito bem... tudo okay!!! agora vamos entender alguns pequenos detalhes...
muito bem... sabemos que PI = 3.14; que é = a 180°, como é que calculamos 1°?
dividimos PI/180  = 0,017444444, muito bem isso é igual a 1° e como é que calculamos 45º é só multiplicar (PI/180)*45 !!!

no método translate(x,y) definimos as coordenadas dos eixos onde a imagem girará em torno!
pra rotacionar a imagem em torno dela mesma, fizemos o seguinte:
vamos supor que a imagem esteja nas coordenadas x=0 e y=0 e suas dimensões são w=100 e h=100
sabemos que o centro da imagem é a coordenada x=50 e y=50, como é que calculamos isso ?
bem e só dividir w e h (width e Height = largura e altura) da imagem por 2!
e se posicionarmos a imagem na coordenada x=25 e y=50 o centro da imagem será =
(w/2)+25 e (h/2)+50, aaaaaaaaaaaaah! intendi, é por isso que somamos 300 no translate(x+300,y+300) no nosso exemplo acima! \(^_^)/ !!!
continuando..... quando mudamos o centro de rotação da imagem, a mesma é deslocada em função disso! por isso que ao definirmos o exito, depois mandar rotacionar, temos que voltar o que foi feito ao normal! então se eu deslocar (x+300) terei depois que deslocar -(x+300) okay ?!

O meu ficou assim:



Muito bem pessoal! até o próximo tutorial!