Animação fica piscando

1 resposta
R

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:

  1. Desenha um quadrado branco do tamanho da janela.
  2. Desenha um quadrado que seria um objeto da animação.
  3. desenha a bola e incrementa sua posição.
  4. 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();
			
			
		}
	}

}

1 Resposta

M

Voce pode ver estes artigos.

O Loop de Animação

E
Sobre Flickering

Voce precisa da tecnica acima para tirar esse efeito piscando (flickering)

Criado 26 de outubro de 2010
Ultima resposta 26 de out. de 2010
Respostas 1
Participantes 2