Em primeiro lugar, não duplique tópicos. Você poderia ter dado continuidade ao assunto no seu post original:
http://www.guj.com.br/posts/list/57701.java
E nem sequer ter criado esse segundo post:
http://www.guj.com.br/posts/list/57585.java
E nem esse terceiro, que estou respondendo agora…
Bem, tenho uma série de sugestões a fazer… Na verdade, tem bastante coisa para melhorar no seu algoritmo. Se você quer partir diretamente para a solução do seu problema, leia o meu próximo post. Mas tire um tempo para ler esse, depois.
- O método pintar() deve ser chamado antes do método contaTempo(). Caso contrario, a tela pode piscar no primeiro quadro (você terá contado o tempo, antes de exibir qualquer imagem);
2.Existe uma regra no swing de que o objeto graphics não deve ser alterado. Para corrigir isso, sempre que utilizar um método do swing (paint, paintComponent, paintComponents, paintChildren ou paintBorder), faça o seguinte:
public void paint(Graphics g)
{
Graphics tela = g.create();
//Aqui vai o seu código normal
tela.dispose();
}
No geral, essa é uma boa prática. Você garante que um método de pintura não irá interferir no outro.
- O segredo para uma boa aplicação de animações está naquele loop, que você chamou de inicioAnimacao.
Quem deve controlar o seu próprio x, y e z são as classes que serão pintadas na tela, ou classes específicas para objetos da animação.
Geralmente, vão ser criadas classes com dois métodos, que serão chamados por seu animation loop:
processLogics(); (Ajusta o x, y e z do objeto animado)
renderGraphics(); (Pinta o objeto)
O animation loop (ou MainLoop), fica com a árdua tarefa de manter a taxa de processamento da lógica constante (independente da velocidade do hardware), enquanto mantém ao máximo possível a atualização dos gráficos (em chamadas ao paint()). Geralmente “o máximo possível” é a taxa de atualização do monitor, ou seja, em torno de 75 quadros em um segundo: mais do que isso é desperdício de processamento.
Esse tipo de abordagem é válido tanto para uma animação estática quanto para jogos de computador. Quanto à isso, fiz esse post no meu blog que explica como funciona um bom animation loop.
Existe uma ótima teoria sobre o animation loop, imagens e animação no site do livro Killer Game Programming in Java.