sexta-feira, 31 de maio de 2013

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

Nenhum comentário:

Postar um comentário