Pages

Banner

sábado, 16 de junho de 2012

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

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


@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 \_(^_^)_/
"

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

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


@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 \_(^_^)_/
Comentários
4 Comentários

4 comentários:

Joton Ferreira disse... Best Blogger Tips

Parabéns cara pelos tutoriais excelente e facil de entender, estão me ajudando muito a me transformar em um desenvolvedor de jogos em java.

Guilherme Moreira Lima disse... Best Blogger Tips

Quero saber como posso realizar os movimentos diagonais
Pode explicar?

Unknown disse... Best Blogger Tips

Simples crie mais ifs para verificação se foi pressionado os dois juntos ai um exemplo:
if((e.getKeyCode()==KeyEvent.VK_UP)&&(e.getKeyCode()==KeyEvent.VK_RIGHT))

Unknown disse... Best Blogger Tips

Como seria o código se a animação de uma sprite sheet dependesse de ficar apertando o botão e não segurando?

Postar um comentário