JAVA GAMES 2D::Eventos do Teclado::12
Autor: Guilherme | Publicado: 2012-06-16T12:50:00-07:00


DOWNLOAD DOS EXEMPLOS AQUI

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&nbsp;tutorial12&nbsp;no nosso projeto&nbsp;JAVAGAMES2D&nbsp;com o arquivo Game.java)





Vamos lá!

1º passo implemente na Classe Game.java a seguinte Interface: KeyListiner


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 &nbsp;em Add unimplmented methods, para que o Eclipse adicione automaticamente essas linhas de código no final da classe Game.java


@Override
 public void keyPressed(KeyEvent e) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void keyReleased(KeyEvent e) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void keyTyped(KeyEvent e) {
  // TODO Auto-generated method stub
  
 }


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


public void inicializar() {
  setTitle("Titulo do Jogo!");
  setSize(janelaW, janelaH);
  setResizable(false);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setLayout(null);
  setVisible(true);
  backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
  
  //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS
  addKeyListener(this);
 }


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


import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Game extends JFrame implements KeyListener{

 BufferedImage backBuffer; 
 int FPS = 30;
 int janelaW = 500;
 int janelaH = 500;
 
 //VAMOS EXIBIR A TECLA PRESSIONADA
 //E MOVER UMA BOLA COM AS DIRECIONAIS
 //OBSER ISSO LÁ NO MÉTODO desenaharGraficos()
 char teclaPressionada;
 int xBola = 200;
 int yBola = 200;
 
 public void atualizar() {

 }

 public void desenharGraficos() {
  Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI
  Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...
  bbg.setColor(Color.WHITE);
  bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO
  
  bbg.setColor(Color.RED);
  bbg.setFont(new Font("helvica",Font.BOLD,20));
  bbg.drawString("Você pressionou: "+teclaPressionada, 50, 100); //EXIBE UM TEXTO + O VALOR DA TECLA PRESSIONADA
  //QUE ESTÁ NA VARIÁVEL teclaPressionada
  
  //DESENHA UMA BOLA VERMELHA NA TELA
  bbg.fillOval(xBola, yBola, 50, 50);
  //AGORA VEJA O CÓDIGO DO MÉTODO keyPressed()
  //LÁ VAMOS DIZER O QUE VAI ACONTECER QUANDO UM TECLA FOR PRESSIONADA!!!
  
  //================================================================================== 
  g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!
 }

 public void inicializar() {
  setTitle("Titulo do Jogo!");
  setSize(janelaW, janelaH);
  setResizable(false);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setLayout(null);
  setVisible(true);
  backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
  
  //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS
  addKeyListener(this);
 }

 public void run() {
  inicializar();
  while (true) {
   atualizar();
   desenharGraficos();
    try {
     Thread.sleep(1000/FPS);
    } catch (Exception e) {
     System.out.println("Thread interrompida!");
    }
  }
 }
 public static void main(String[] args) {
  Game game = new Game();
  game.run();
 }

 //ESSES SÃO OS MÉTODOS DE EVENTOS DO TECLADO
 public void keyPressed(KeyEvent e) {
  
  //AQUI A VARIAVEL VAI RECEBER O VALOR UNICODE DA TECLA QUE O USUÁRIO PRESSIONAR!!!
  teclaPressionada = e.getKeyChar();
  
  //OBS: e.VK_  depois pressione ctrl+espaço para autocompletar!
  //ai tem todas as teclas do teclado!!!
  
  //SE A TECLA PRESSIONADA FOR LEFT = ESQUERDA xBola diminue 10
  if(e.getKeyCode() == e.VK_LEFT){
   xBola -= 10;
  }
  //SE A TECLA PRESSIONADA FOR RIGHT = DIREITA xBola aumenta 10
  if(e.getKeyCode() == e.VK_RIGHT){
   xBola += 10;
  }
  //SE A TECLA PRESSIONADA FOR UP = CIMA yBola diminue 10
  if(e.getKeyCode() == e.VK_UP){
   yBola -= 10;
  }
  //SE A TECLA PRESSIONADA FOR DOWN = BAIXO yBola aumenta 10
  if(e.getKeyCode() == e.VK_DOWN){
   yBola += 10;
  }
  
 }//FIM DO MÉTODO keyPressed()
 
 public void keyReleased(KeyEvent e) {
  
 }
 public void keyTyped(KeyEvent e) {
  
 }
}


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



\_(^_^)_/ Comentários e Dúvidas \_(^_^)_/