Olá amigos, estou com um problema em java usando Graphics2D
Quero fazer uma animação em que as as duas rodas da bicicleta faça Rotate e ao mesmo tempo que as
rodas e a bicicleta como todo se desloca no eixo X (Translate(x, 0))
Podem me ajudar a resolve-lo?
import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.;
import java.lang.;
import javax.swing.;
public class TesteA extends JPanel {
//variaveis globais
private int numeroDeQuadro;
private long tempoPassado;
private float tamanhoPixel;
public static void main(String[] args) {
JFrame janela = new JFrame("Projeto Java - Flavio & Silvino");
final TesteA panel = new TesteA();
janela.setContentPane(panel);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.pack();
Dimension ecra = Toolkit.getDefaultToolkit().getScreenSize();//tamanho da janela
janela.setLocation((ecra.width - janela.getWidth()) / 2,
(ecra.height - janela.getHeight()) / 2 - 30);//centrar janela
janela.setVisible(true);
//panel.requestFocusInWindow();
janela.setResizable(true);
//animar os objetos
final long tempoInicio = System.currentTimeMillis();
Timer tempoAnimacao = new Timer(16,
new ActionListener() {
public void actionPerformed(ActionEvent arg) {
panel.numeroDeQuadro++;
panel.tempoPassado = System.currentTimeMillis() - tempoInicio;
panel.repaint(); //redesenhar os objetos na janela
}
});
tempoAnimacao.start();
}
// construtor
public TesteA() {
setPreferredSize(new Dimension(1300, 650));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.darkGray);
g2.fillRect(0, 0, getWidth(), getHeight());
aplicarTransformacaoWindowToViewport(g2, 0, getWidth(), getHeight(), 0, true);
//ANIMAÇÃO
//Raio da roda de traz
Path2D raios = new Path2D.Double();
g2.translate(3, 0);
g2.rotate(numeroDeQuadro * 0.05, 125, 545);//fazer girar a figura
g2.translate(-3, 0);
g2.setStroke(new BasicStroke(2 * tamanhoPixel));
g2.setPaint(Color.WHITE);
//double angulo = (2*Math.PI/4);
raios.moveTo(125, 545);
raios.lineTo(125, 525);
raios.moveTo(125, 545);
raios.lineTo(125, 565);
raios.moveTo(125, 545);
raios.lineTo(105, 545);
raios.moveTo(125, 545);
raios.lineTo(145, 545);
raios.moveTo(125, 545);
raios.lineTo(112.5, 530);
raios.moveTo(125, 545);
raios.lineTo(112.5, 560);
raios.moveTo(125, 545);
raios.lineTo(138.5, 560);
raios.moveTo(125, 545);
raios.lineTo(138.5, 530);
g2.draw(raios);
//Raio da roda de frente
Path2D raios2 = new Path2D.Double();
g2.translate(3, 0);
g2.rotate(numeroDeQuadro * 0.05, 225, 545);//fazer girar a figura
g2.translate(-3, 0);
// g2.translate(50, 0);
g2.setStroke(new BasicStroke(2 * tamanhoPixel));
g2.setPaint(Color.WHITE);
raios2.moveTo(225, 545);
raios2.lineTo(225, 525);
raios2.moveTo(225, 545);
raios2.lineTo(225, 565);
raios2.moveTo(225, 545);
raios2.lineTo(205, 545);
raios2.moveTo(225, 545);
raios2.lineTo(245, 545);
raios2.moveTo(225, 545);
raios2.lineTo(212.5, 530);
raios2.moveTo(225, 545);
raios2.lineTo(212.5, 560);
raios2.moveTo(225, 545);
raios2.lineTo(238.5, 560);
raios2.moveTo(225, 545);
raios2.lineTo(238.5, 530);
g2.draw(raios2);
g2.setPaint(new Color(255, 235, 0));//rodas
g2.setStroke(new BasicStroke(8));
g2.drawOval(100, 520, 50, 50);//traseira
g2.drawOval(205, 527, 40, 40);//frente
Path2D.Double q4 = new Path2D.Double();// pidal
g2.setPaint(new Color(0, 0, 0));
q4.moveTo(175, 552);
q4.lineTo(175, 537);
g2.setStroke(new BasicStroke(4));
g2.draw(q4);
Path2D.Double q = new Path2D.Double();//quadro
g2.setPaint(new Color(60, 255, 25));
q.moveTo(125, 545);
q.lineTo(160, 500);
q.lineTo(170, 550);
q.closePath();
q.moveTo(170, 550);
q.lineTo(210, 500);
q.lineTo(160, 500);
q.moveTo(160, 500);
q.lineTo(160, 485);
q.moveTo(210, 500);
q.lineTo(225, 545);
q.moveTo(210, 500);
q.lineTo(210, 485);
g2.setStroke(new BasicStroke(4));
g2.draw(q);
Path2D.Double q1 = new Path2D.Double();//volante
g2.setPaint(new Color(255, 235, 0));
q1.moveTo(220, 475);
q1.lineTo(200, 490);
g2.setStroke(new BasicStroke(7));
g2.draw(q1);
Path2D.Double q2 = new Path2D.Double();//cilim
g2.setPaint(new Color(255, 235, 0));
q2.moveTo(155, 485);
q2.lineTo(165, 485);
g2.setStroke(new BasicStroke(10));
g2.draw(q2);
g2.setColor(Color.lightGray);
g2.fillOval(165, 540, 20, 20);//pedal
Path2D.Double q3 = new Path2D.Double();//cilim
g2.setPaint(new Color(0, 0, 0));
q3.moveTo(175, 552);
q3.lineTo(175, 565);
g2.setStroke(new BasicStroke(4));
g2.draw(q3);
}
private void aplicarTransformacaoWindowToViewport(Graphics2D grafico2d, double esquerda, double direita, double inferior, double superior, boolean preservarAspecto) {
int largura = getWidth(); // Largura da area de desenho, em píxeis.
int altura = getHeight(); // Altura da área de desenho, em píxeis.
if (preservarAspecto) {
// Ajustar os limites para match a relação de aspecto da área de desenho.
double exibirAspecto = Math.abs((double) altura / largura);
double aspectoPedido = Math.abs((inferior - superior) / (direita - esquerda));
if (exibirAspecto > aspectoPedido) {
// Expandir o viewport verticalmente.
double excesso = (inferior - superior) * (exibirAspecto / aspectoPedido - 1);
inferior += excesso / 2;
superior -= excesso / 2;
} else if (exibirAspecto < aspectoPedido) {
// Expandir o viewport horizontalmente.
double excesso = (direita - esquerda) * (aspectoPedido / exibirAspecto - 1);
direita += excesso / 2;
esquerda -= excesso / 2;
}
}
grafico2d.scale(largura / (direita - esquerda), altura / (inferior - superior));
grafico2d.translate(-esquerda, -superior);
double larguraPixel = Math.abs((direita - esquerda) / largura);
double alturaPixel = Math.abs((inferior - superior) / altura);
tamanhoPixel = (float) Math.max(larguraPixel, alturaPixel);
}
}