Muovere una figura in un JFrame (Java)

di il
2 risposte

Muovere una figura in un JFrame (Java)

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();
		
	}
}

2 Risposte

  • Re: Muovere una figura in un JFrame (Java)

    Ciao,

    ho un suggerimento, prova ad aggiungere un attributo "direzione" alla macchina che possa valere 1 o -1; usa un metodo solo di ristampa moltiplicando dove server per la direzione e modifica così l'event
    if (car.getXre() >= 460)
    direzione = direzione *(-1);

    aggiungi questo x quando la macchina arriva dall'altra parte
    if (car.getXre() <= 0)
    direzione = direzione *(-1);
  • Re: Muovere una figura in un JFrame (Java)

    Grandissimo fastor! ora funziona alla grande, ho inserito nel costruttore un parametro "int direzione = 1" ed ho dichiarato pubblico tale parametro, dopodichè ho inserito nel ricevitore questo codice:
    				car.ristampa(1);
    				if (car.getXre() >= 460)
    					car.direzione = car.direzione *  (-1);
    				if (car.getXre() <= 0)
    					car.direzione = car.direzione *  (-1);
    Ora non solo funziona, ma mi hai snellito anche il codice xD.

    Solo che non capisco, in pratica dovrebbe essere lo stesso metodo che ho usato io prima, non capisco perchè in questo modo funziona e nel mio no o.O...

    In ogni caso ti ringrazio ancora fastor! ci stavo perdendo la testa xD

    @Edit: AHHHHHH ho capito dov'era l'errore, in pratica quando car.getXre() era maggiore o uguale a 460 si attivava il secondo metodo che faceva indietreggiare la macchina, ma allo stesso tempo restava attivo anche il metodo che faceva andare avanti la macchina, i due metodi essendo opposti si annullano, ed ecco perchè la macchina si fermava xD
Devi accedere o registrarti per scrivere nel forum
2 risposte