Bewegungen auf einem JPanel zeichnen lassen

  • Themenstarter Themenstarter ByeBye 249712
  • Beginndatum Beginndatum
B

ByeBye 249712

Hallo,

ich zeichne auf einem JPanel zwei Vierecke die sich selbständig bewegen und mit Hilfe der Tastatur steuern lassen. Jetzt möchte ich das dort wo die Vierecke schon waren sich der Hintergrund einfärbt in der Farbe der Vierecke, sodaß bei fortschreitender Bewegung eine Linie gezeichnet wird. Kann mir da jemand weiterhelfen, wie ich sowas realisiere, steh da grad ziemlich im Wald. :)
Vielen Dank
 
Der einfachste Ansatz wäre wohl, sich alle Positionen zu merken, an denen die Objekte schon waren, und sie dort noch einmal zu zeichnen...
 
der code wär vielleicht auch hilfreich, den hatte ich vergessen

Java:
public class Keylistener extends JPanel implements ActionListener, KeyListener {

    /**
	 * SerialUID.
	 */
	private static final long serialVersionUID = 1L;


    private final int timer = 5;

   
       private final int m = -1;
	

	private final int n =  1;
    
    

    private int x = 0, y = 0, velx = 0, vely = 0;


    private final int Startposition1 = 100;

 
    private final int Startposition2 = 100;


    private int z = Startposition1, q = Startposition2, velz = 0, velq = 0;

    final int l = 10;
    
    private Timer t = new Timer(timer, (ActionListener) this);
    
    

    public Keylistener() {
        
    	t.start();
        addKeyListener((KeyListener) this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    
    }

    

    
    
    
	
    
    
	public void paint(final Graphics g) {

		super.paint(g);
		
	    int h = getWidth();
	    int ö = getHeight();
	 
	 
	        for (int x = 0; x < h; ++x) {
	        
	        for (int y = 0; y < ö; ++y) {
	            g.setColor(Color.black);
	            Graphics2D g2 = (Graphics2D)g;
	            g2.fillRect(x * 10 + x,
	                    y * 10 + y, 10,
	                    10);
	        }}  

		
		
		
        this.setBackground(Color.green);
        
        Graphics2D g2 = (Graphics2D) g;
        g.setColor(Color.blue);
        g2.fillRect(x, y, l, l);
        g2.fillRect(z, q, l, l);

    }
    

	/**
	 * @param e
	 * ActionEvent e
	 * @Override
	 */
	public final void actionPerformed(final ActionEvent e) {

		repaint();
		x += velx;
		y += vely;

		repaint();
		z += velz;
		q += velq;
	
	}

 
	
	

    public final void up() {

		vely = m;
		velx = 0;
	
		
		
    }




	public final void down() {

		vely = n;
		velx = 0;
	
	}


	public final void left() {

		velx = m;
		vely = 0;
	
	}


	public final void right() {

		velx = n;
		vely = 0;
	
	}


	public final void up2() {

		velq = m;
        velz = 0;
    
	}


    public final void down2() {

    	velq = n;
    	velz = 0;
    
    }

 
    public final void left2() {

    	velz = m;
	    velq = 0;
    
    }

 
    public final void right2() {

    	velz = n;
    	velq = 0;
    
    }

    /**
     * @param e
     * KeyEvent e
     * @Override
     */
    public final void keyPressed(final KeyEvent e) {

		int code = e.getKeyCode();

		if (code == KeyEvent.VK_UP) {

			up2();
		}

		if (code == KeyEvent.VK_DOWN) {

			down2();
		}

		if (code == KeyEvent.VK_RIGHT) {

			right2();
		}

		if (code == KeyEvent.VK_LEFT) {

			left2();
		}

		if (code == KeyEvent.VK_W) {

			up();
		}

		if (code == KeyEvent.VK_S) {

			down();
		}

		if (code == KeyEvent.VK_D) {

			right();
		}

		if (code == KeyEvent.VK_A) {

			left();
		}

    }
    
    /**
     * @param e
     * KeyEvent e
     * @Override
     */
	public final void keyTyped(final KeyEvent e) {
	}

	/**
	 * @param e
     * KeyEvent e
	 * @Override
	 */
	public final void keyReleased(final KeyEvent e) {
	}

}


Die frage ist halt wo hole ich mir die Positionen her und wie verfahre ich damit dann weiter, so das die Objekte dann dort wieder gezeichnet werden wo sie schon waren?
 
Zuletzt bearbeitet von einem Moderator:
Um die Positionen zu speichern bietet sich wohl die Klasse Vector an.
Du könntest entweder alle Positionen speichern, an denen die Vierecke schon waren, oder dir die Koordinaten als Polygon speichern. Die ersten Koordinaten wären die Startkoordinaten, danach hängst du bei jeder Richtungsänderung die letzten Koordinaten an:

P: Oben links
Q: Unten rechts
Viereck Startposition: P(1/1) Q(2/2)
Du bewegst dich nach rechts, die Startkoordinaten werden in den Vector eingetragen.
Viereck Position: P(5/1) Q(6/2)
Du bewegst dich jetzt nach unten, jetzt schreibst du die Positionen wieder in den Vector.
Viereck Position: P(5/5) Q(6/6)
Usw...

Danach kannst du den Vector gemütlich in einer Schleife durchgehen und die Vierecke der Reihe nach einzeichnen. Der letzte Punkt ist logischer Weise immer die aktuelle Position des Vierecks.
 
Also wollte das jetzt mal mit ner ArrayList probieren, aber irgendwie weis ich nicht wie ich die Koordinaten in die ArrayList übertrage, mit nem Vektor geht glaub ich net weil der keine Ints verarbeiten kann oder?
 
Ich würde weder einen Vector noch eine ArrayList nehmen, sondern einfach eine LinkedList - da du hier ja ständig Objekte einfügst, aber nie speziell auf das i-te Element zugreifst, sondern immer nur mit einer for -Schleife über die Collection iterierst, dürfte das am effizientesten sein.
Das sind aber nur Optimierungsspielchen, für den ersten Schritt völlig egal.

Was du in die Liste reinschreibst, hängt von deiner Implementierung ab, die ich gerade nicht ganz nachvollziehen kann. Was machen die beiden for-Schleifen genau? Nimm mal das

Code:
                g.setColor(Color.black);
                Graphics2D g2 = (Graphics2D)g;
aus der Schleife raus - es reicht, wenn du das vor den Schleifen einmal tust...

Für den einfachsten Fall, dass dein Viereck ein Rechteck mit konstanter Größe ist, würde ich mir nur die Position der oberen linke Ecke deines Objektes in jeder Iteration in der Liste merken - z.B., indem du die Liste als List<Point> deklarierst und nach jedem Zeichenvorgang ein list.add (new Point(x,y)) aufrufst.
 
Also die for Schleifen zeichnen bloß den Hintergrund auf dem sich die Kästchen bewegen.

Java:
List<Point>Schlange = new List<Point>();
list.add (new Point(x,y));

musss dass so aussehn? Mein Eclipse mekert da noch rum.
 
Eine Fehlermeldung ist immer nicht schlecht - "meckert noch rum" ist wenig hilfreich...

Ich vermute mal stark, dass er sich beschwert, weil du versuchst, das Interface "List" zu instanziieren. Das kann so nicht klappen. Nimm stattdessen eine LinkedList!
 
Der Ausdruck:
Code:
list.add (new Point(x,y));
kann so nicht klappen, da mit "list" vermutlich die Liste gemeint ist, die du eine Zeile vorher erzeugst richtig? Also müsste der Ausdruck in deinem Fall lauten:
Code:
Schlange.add(new Point(x,y));
Des Weiteren sollten Variablennamen immer klein geschrieben werden aber das ist nur eine Konvention und erzeugt natürlich keinen Fehler.
 
Zurück