Salve a tutti, sono nuovo, ho trovato questo forum per caso e l'ho trovato molto interessante, così ho deciso di iscrivermi.
Vi espongo il mio problema, sperando che qualcuno di voi possa aiutarmi.
In pratica devo far muovere una macchina (figura) in un JFrame, e quando questa arriva al bordo del frame dovrebbe invertire la rotta. Il problema è che con il metodo che utilizzo io, arrivato al bordo la macchina non torna indietro, ma si ferma, ho capito qual'è il problema, in pratica uso un if, che dice alla macchina di invertire la rotta quando arriva ad un determinato punto, però quando questa torna indietro di 1, e quindi non si trova più nel punto dell'if ritorna ad andare avanti.
Non riesco a trovare un metodo che mi permetta di far tornare indietro la macchina fino al punto di partenza
Vi allego qui il codice:
Questo è il codice che crea la macchina e i suoi metodi:
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import java.awt.geom.Ellipse2D;
import java.awt.Rectangle;
import java.awt.geom.Line2D;
public class Macchina extends JComponent
{
/** In questo costruttore creo le figure che compongono la macchina*/
public Macchina(int x, int y)
{
cappotta = new Line2D.Double(x + 10,y,x + 30,y);
vetro1 = new Line2D.Double(x + 10, y , x + 3 , y + 20);
vetro2 = new Line2D.Double(x + 30, y , x + 37 , y + 20);
carrozzeria = new Rectangle(x,y + 20, 40,10);
ruota1 = new Ellipse2D.Double(x + 5,y + 30, 6,6);
ruota2 = new Ellipse2D.Double(x + 30,y + 30, 6,6);
}
/**con questo metodo la disegno*/
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.draw(cappotta);
g2.draw(vetro1);
g2.draw(vetro2);
g2.draw(carrozzeria);
g2.draw(ruota1);
g2.draw(ruota2);
}
/**con questo metodo la faccio muovere in avanti nel JFrame*/
public void ristampa1(int n)
{
cappotta.setLine(cappotta.getX1() + n,cappotta.getY1(),cappotta.getX2() + n,cappotta.getY2());
vetro1.setLine(vetro1.getX1() + n, vetro1.getY1() , vetro1.getX2() + n , vetro1.getY2() );
vetro2.setLine(vetro2.getX1() + n, vetro2.getY1() , vetro2.getX2() + n , vetro2.getY2());
carrozzeria.translate(n,0);
ruota1 = new Ellipse2D.Double(ruota1.getX() + n,ruota1.getY(), 6,6);
ruota2 = new Ellipse2D.Double(ruota2.getX() + n,ruota2.getY(), 6,6);
repaint();
}
/**con questo invece la faccio muovere indietro*/
public void ristampa2(int n)
{
cappotta.setLine(cappotta.getX1() - n,cappotta.getY1(),cappotta.getX2() - n,cappotta.getY2());
vetro1.setLine(vetro1.getX1() - n, vetro1.getY1() , vetro1.getX2() - n , vetro1.getY2() );
vetro2.setLine(vetro2.getX1() - n, vetro2.getY1() , vetro2.getX2() - n , vetro2.getY2());
carrozzeria.translate( - n,0);
ruota1 = new Ellipse2D.Double(ruota1.getX() - n,ruota1.getY(), 6,6);
ruota2 = new Ellipse2D.Double(ruota2.getX() - n,ruota2.getY(), 6,6);
repaint();
}
/**uso questo metodo per sapere il punto x del rettangolo che costituisce la macchina,
che essendo la figura più grande mi dà così anche il punto x della macchina*/
public double getXre()
{
return carrozzeria.getX();
}
private Line2D.Double cappotta;
private Line2D.Double vetro1;
private Line2D.Double vetro2;
private Rectangle carrozzeria;
private Ellipse2D.Double ruota1;
private Ellipse2D.Double ruota2;
}
Questo è il codice che fa muovere la macchina:
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JPanel;
public class MuoviMacchina
{
public static void main(String[] args)
{
JFrame win = new JFrame();
win.setTitle("Macchina in movimento");
win.setSize(500,500);
win.setVisible(true);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Macchina car = new Macchina(10,10);
win.add(car);
/**questa è la classe interna (ricevitore) che mi permette di muovere la macchina
460 è la differenza tra la larghezza del frame (500) e la lunghezza della macchina (40)*/
class Sposta implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
car.ristampa1(1);
if (car.getXre() >= 460)
car.ristampa2(1);
}
}
ActionListener evento = new Sposta();
Timer t = new Timer(10,evento);
t.start();
}
}