Java: A primeira animação

Exercicio para estudantes da UCM para os cursos de Programaçao Orientada para Objectos e Laboratorio de Programação.

Tema

Fazer a nossa primeira animação em java: mover uma imagem dentro de um quadro utilizando as teclas de setas.

primeira Animaçao

teclasSetasA classe Animation estende-se uma classe JFrame para criar a janela da applição:

public class Animation extends JFrame{
 private int width = 210;
 private int height = 420;
 Quadro qd;

 public Animation(){
   setSize(width,height);
   qd = new Quadro();
   add(qd);

   setDefaultCloseOperation(EXIT_ON_CLOSE);
   setLocationRelativeTo(null);
   setVisible(true);
   setTitle("Animaçao");
 }

 public void init(){
    qd.init();
 }

 public static void main(String[] args) {
    Animation a = new Animation();
    a.init();
 }

}

Quadro è a nossa classe JPanel lugar onde “vamos a jogar”, implementa interface KeyListener para “ouvir” os eventos d teclado.

 public class Quadro extends JPanel implements KeyListener {

Attributos:

// posiçao x,y do canto esquerdo superior da imagem
 private int x;
 private int y;
 // tamanho do quadro
 private int maxHeight,maxWidth;
 // tamanho da imagem
 private int widthImage = 21;
 private int heightImage = 21;

Image img;

Construtor:

public Quadro() {
 x = 0;
 y = 0;
 img = Toolkit.getDefaultToolkit().getImage("c:\\temp\\amarelho.jpg"); 
 setFocusable(true);
 requestFocusInWindow();
 }

A imagem que vamos usar, por simplicidade vamos copiar na pasta c:\temp : amarelho     Para “desenhar” a nossa imagem no JPanel quadro dovemos sobre-escrever o metodos paintComponent

@Override
 public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, x,y,this);
 }

A imagem è “desenhada” na posiçao x,y: a referência è  a posiçao do canto esquerdo superior. Agora precisa implementar os metodo das interface KeyListener em particolar o metodo keyPressed

public void keyPressed(KeyEvent ke){
 //System.out.println(ke.getKeyCode()+"--"+ke.getKeyChar());
switch(ke.getKeyCode()){
 case KeyEvent.VK_UP:
   if (this.y > 0) {
     this.y --;
     repaint();
   }
   break;
 case KeyEvent.VK_DOWN:
   if (this.y < this.maxHeight) {
     this.y ++;
     repaint();
   }
   break;
 case KeyEvent.VK_LEFT:
   if (this.x > 0) {
     this.x --;
     repaint();
   }
   break;
 case KeyEvent.VK_RIGHT:
   if (this.x < this.maxWidth) {
    this.x ++;
    repaint();
   }
   break;
 }
 }

public void keyReleased(KeyEvent ke){}
public void keyTyped(KeyEvent ke){}

KeyEvent è  o evento gerado depois dum click no teclado. A segunda da tecla seta clicada mudamos as coordenadas x ou y depois vamos chamar o metodo repaint para um “refresh” do nosso JPanel. Precisa sempre controlar as coordenadas para nao sair da o nosso quadro. No fim o metodo init que inicializa o nosso quadro em particolar o espaço (tamanho) do nosso JPanel, o setSize(..) dum JFrame comprende as bordas Primeira Animaçao 2

public void init(){
 addKeyListener(this);
 /** O tamanho do JPanel è inferior aquela do JFrame porque no setSize
 * comprende as bordas.
 */
 JFrame parent = (JFrame) SwingUtilities.getWindowAncestor(this);
 Dimension dimParentFrame = parent.getContentPane().getSize();
 /**
 * Precisa fixar um limitar o espaço se nao a imagem va sair da o  quadro
 *
 */
 maxHeight = (int) dimParentFrame.getHeight() - heightImage;
 maxWidth = (int) dimParentFrame.getWidth() - widthImage;
 }

Agora a nossa aplicação è completa e podemos jogar :) Claro è um exemplo basico ma è o punto inicial para desenvoler jogos como:

Pode enviar duvidas para email smura@ucm.ac.mz.