Precedente Indice

Animare la palla - il sorgente

  • Nel file MyPanelAnimazione.java scriveremo:
    package frameanimazione;

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;

    import javax.swing.JPanel;

    public class MyPanelAnimazione extends JPanel implements Runnable {
    private static final int WIDTH=400;
    private static final int HEIGHT=300;

    private static final long serialVersionUID = 1L;

    private Image immagine;
    private int x;
    private int y;
    private int dx;
    private int dy;
    private Thread animazione;

    public MyPanelAnimazione() {
    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    setBackground(new Color(0xff, 0xff, 0xcc));
    x = WIDTH / 2;
    y = HEIGHT / 2;
    dx = 1;
    dy = 1;
    immagine = Toolkit.getDefaultToolkit().getImage("palla.png");
    animazione = new Thread(this);
    animazione.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(immagine, x - immagine.getWidth(this) / 2,
    y - immagine.getHeight(this) / 2, this);
    }

    public void stop() {
    animazione = null;
    }

    public void eseguiAzione1() {
    dx *= -1;
    }

    public void eseguiAzione2() {
    dy *= -1;
    }

    @Override
    public boolean imageUpdate(Image arg0, int infoFlags, int x, int y,
    int width, int heignt) {
    repaint();
    return (infoFlags & ALLBITS) != ALLBITS;
    }

    @Override
    public void run() {
    while (Thread.currentThread() == animazione) {
    x += dx;
    y += dy;
    if (x < immagine.getWidth(this) / 2) {
    dx = 1;
    } else if (x > WIDTH - immagine.getWidth(this) / 2) {
    dx = -1;
    }
    if (y < immagine.getHeight(this) / 2) {
    dy = 1;
    } else if (y > HEIGHT - immagine.getHeight(this) / 2) {
    dy = -1;
    }
    repaint();
    try {
    Thread.sleep(20);
    } catch (Exception e) {
    }
    }
    }

    }
  • Nel file MyFrameAnimazione.java copieremo il contenuto di MyFrameImmagine, cambiando solo il package, la classe del pannello e le etichette di b1 (Rimbalza Verticale) e b2 (Rimbalza Orizzontale) ed aggiungere, nella gestione del bottone fine una invocazione del metodo disegno.stop();
  • Nel main come al solito cabieremo solo il nome della classe della finestra.
© Ing. Stefano Salvi - released under FDL licence

Valid XHTML 1.0! Valid CSS!