Olá!
estou tentando fazer uma simples animação com Java.
quero desenhar alguns quadrados na tela e fazer uma bolinha ficar correndo por eles.
Eu ja consegui fazer funcionar, porém os objetos da tela ficam piscando enquanto a bola esta correndo.
Eu fiz um laço da seguinte forma:
- Desenha um quadrado branco do tamanho da janela.
- Desenha um quadrado que seria um objeto da animação.
- desenha a bola e incrementa sua posição.
- Faço um sleep de 3ms.
e volta para o passo 1.
Como faço para as imagens não ficarem com este efeito?
Abaixo segue todo o código funcionando:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Ball extends JFrame implements Runnable{
/**
* Para tirar o erro do Eclipse
*/
private static final long serialVersionUID = 1L;
private boolean rodando = true;
private Thread anima1;
private Canvas areaAnim;
private Point[] Bolas = new Point[5];
public Ball(){
this.setSize(800,600);
this.setTitle("TESTE de Animação");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel pnlBotoes = new JPanel();
//pnlBotoes.setBackground(Color.GRAY);
JButton btnLancaBola = new JButton("Lançar!");
btnLancaBola.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
// inclui bola
int i=0;
boolean continua = true;
while(continua){
if(Bolas[i] == null){
Bolas[i] = new Point(0, 0);
}
i++;
continua = false;
}
}
});
pnlBotoes.add(btnLancaBola);
this.getContentPane().add(pnlBotoes,"South");
areaAnim = new Canvas();
areaAnim.setBackground(Color.WHITE);
this.getContentPane().add(areaAnim,"Center");
this.setVisible(true);
anima1 = new Thread(this);
anima1.start();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Ball b1 = new Ball();
}
@Override
public void run() {
// TODO Auto-generated method stub
int i,ysize = 50;
boolean teste = true;
while(rodando){
Graphics2D g2d = (Graphics2D)areaAnim.getGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, areaAnim.getWidth(), areaAnim.getHeight());
g2d.setColor(Color.GREEN);
g2d.fillRect(200, 0, 300, 500);
i=0;
do {
if(Bolas[i]==null)teste = false;
else{
g2d.setColor(Color.BLUE);
g2d.fillOval(++Bolas[i].x, ++Bolas[i].y, 10, 10);
i++;
}
} while (teste);
try {
Thread.sleep(3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g2d.dispose();
}
}
}