# Figur bewegen



## mavinatic (22. Jul 2010)

Hallo ich bin dabei mir ein kleines spiel zu schreiben bin jedoch wie alle beginner an den anfängen 

Mein Playground wird gezeichnet und alle Daten werden eingelesen. Ich habe eine Class Player die Variblen festlegt und diese sich mit get/set Methoden bearbeiten lassen.

Dann habe ich nochn Keylistener der mir die Bewegung ins Spiel bringt aber iwie funktioniert das nicht :/

Player class

```
package de.GameDemo.Map;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;


public class Player {
	private int posx;
	private int posy;
	private int speed;
	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}
	private Rectangle2D playerShape =null;
	
	public int getPosx() {
		return posx;
	}

	public void setPosx(int posx) {
		this.posx = posx;
	}

	public int getPosy() {
		return posy;
	}

	public void setPosy(int posy) {
		this.posy = posy;
	}

	public Player() {
	    playerShape = new Rectangle2D.Double(posx+64,posy+64,32,32);
	}
	public Shape getShape() {
		return playerShape;
	}
}
```

MainPanel 
	
	
	
	





```
package de.GameDemo.GUI;

import java.awt.Graphics;
import java.awt.GridLayout;
import java.io.IOException;

import javax.swing.JPanel;

import de.GameDemo.DataReader.ReadMapData;
import de.GameDemo.DataReader.ReadTextures;
import de.GameDemo.Listeners.KeyboardListener;
import de.GameDemo.Map.DrawPlayer;
import de.GameDemo.Map.Player;
import de.GameDemo.Map.Playground;


public class MainPanel extends JPanel 
{
	MainPanel mainpanel = null;
	
	ReadTextures rt = new ReadTextures();
	ReadMapData rmd = new ReadMapData();
	
	Player p = new Player();
	
	KeyboardListener kbl = new KeyboardListener(p);
	
	public MainPanel() throws IOException {
		setLayout(new GridLayout(1,1));
		
		setFocusable(true);
		addKeyListener(kbl);
	}
	
	public void paint(Graphics g) {
		Playground ground = new Playground(g, rmd.getMap(), rt.getImages());
		DrawPlayer dp = new DrawPlayer(g,p);
	}
	public void setMainPanel(MainPanel panel) {
		kbl.setMainpanel(panel);
	}
}
```

Listener 

```
package de.GameDemo.Listeners;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import de.GameDemo.GUI.MainPanel;
import de.GameDemo.Map.Player;

public class KeyboardListener implements KeyListener {
	Player p = null;
	MainPanel mainpanel = null;
	
	public KeyboardListener(Player p) {
		this.p = p;
		p.setSpeed(32);
	}
	
	public void setMainpanel(MainPanel mainpanel) {
		this.mainpanel = mainpanel;
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		if(arg0.getKeyCode() == 68) {
			p.setPosx(p.getPosx()+p.getSpeed());
			mainpanel.repaint();
		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}
```

Könnt ihr mir'n paar tipps geben wie ich meine figur zum laufen bringe ?

Danke im voraus


----------



## Ruzmanz (22. Jul 2010)

Wo wird den der Mainpanel beim KeyListener gesetzt, sodass die repaint() Methode aufgerufen werden kann?

Es wäre schöner wenn du mit e.getKeyCode() == KeyEvent.VK_DOWN vergleichst. Dann weis auch jeder, welche Taste das ist^^


----------



## mavinatic (22. Jul 2010)

es ist die D taste 

Ich versteh deine Frage nicht?

```
public void setMainPanel(MainPanel panel) {
		kbl.setMainpanel(panel);
	}
```


----------



## Ruzmanz (22. Jul 2010)

Wo wird 


```
public void setMainPanel(MainPanel panel) {
        kbl.setMainpanel(panel);
    }
```

aufgerufen? Immerhin soll er doch auf deinem Panel repainten, welches meiner Meinung nach null ist:


```
mainpanel.repaint();
```


----------



## mavinatic (22. Jul 2010)

Warum kommt keine Exception wenns Null ist? Das finde ich komisch?!

Ich habs nun umgeändert


```
package de.GameDemo.GUI;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.RenderingHints.Key;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import java.io.IOException;

import javax.swing.JPanel;

import de.GameDemo.DataReader.ReadMapData;
import de.GameDemo.DataReader.ReadTextures;

import de.GameDemo.Listeners.KeyboardListener;
import de.GameDemo.Map.Playground;
import de.GameDemo.Player.Player;


public class MainPanel extends JPanel 
{
	ReadTextures rt = new ReadTextures();
	ReadMapData rmd = new ReadMapData();
	
	Player p = new Player();
	Rectangle r = new Rectangle(p.getX(),p.getY(),32,32);
	
	
	MainPanel panel = this;
	
	public MainPanel() throws IOException {
		setLayout(new GridLayout(1,1));
		
		p.setModel(r);
		
		KeyboardListener kbl = new KeyboardListener(panel,p);
		addKeyListener(kbl);
		setFocusable(true);
	}

	public void paint(Graphics g) {
		Playground ground = new Playground(g, rmd.getMap(), rt.getImages());
		
		Graphics2D g2 = (Graphics2D) g;
		g2.fill(p.getModel());
		g2.draw(p.getModel());
	}
}
```


```
@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		if(arg0.getKeyCode()==KeyEvent.VK_RIGHT) {
			player.setX(player.getX()+32);
			main.repaint();
		}
	}
```

aber es funktioniert immernoch nicht! MainPanel wird übergeben!


----------



## Ruzmanz (22. Jul 2010)

- Klick in das Fenster und versuch dann die Taste zu drücken.
- Debugger benutzten -> Geht der in deinen KeyListner rein?


----------



## mavinatic (22. Jul 2010)

Ja der geht uach in den listener rein :O


----------



## Quaxli (23. Jul 2010)

Ich hab' mal dran rumgefrickelt. Dabei habe ich das Ganze soweit modifiziert, daß es als selbständiges Programm ausführbar ist. Dann kann der Hilfswillige hier im Forum das Ganze auch mal ausprobieren (Merken für die Zukunft ) - dann kriegt man auch schneller geholfen.

Hier erst mal der modifizierte Code, weiter Anmerkungen dann unten:


```
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import javax.swing.*;

public class MainPanel extends JPanel {

	KeyboardListener	kbl;
	Player						p;
	JFrame						frame;

	public static void main(String[] args) {
		new MainPanel();
	}

	public MainPanel() {
		p = new Player(50, 50);
	
		setPreferredSize(new Dimension(400, 400));

		frame = new JFrame("test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.setLocation(100, 100);
		frame.pack();
		kbl = new KeyboardListener(p, frame);
		frame.addKeyListener(kbl);
		frame.setVisible(true);
	}

	public void paint(Graphics g) {
		p.paintPlayer(g);
	}

}

class Player extends Rectangle2D.Double {

	private int	speed;

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	public Player(int posx, int posy) {
		super(posx + 64, posy + 64, 32, 32);
	}

	public void paintPlayer(Graphics g) {
		g.setColor(Color.RED);
		g.fillRect((int) x, (int) y, (int) width, (int) height);
	}
}

class KeyboardListener implements KeyListener {

	Player		p;
	JFrame parent;

	public KeyboardListener(Player p, JFrame mp) {
		this.p = p;
		parent = mp;
		p.setSpeed(32);
	}

	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			p.x = (p.getX() + p.getSpeed());
			parent.repaint();
		}
	}

	public void keyReleased(KeyEvent arg0) {

	}

	public void keyTyped(KeyEvent arg0) {

	}

}
```


So mit obigem Code hast Du eine ausführbares Beispiel zur weiteren Diskussion. Ich habe einige eigenwillige Konstrukte von Dir mal abgeändert. Warum sollte z. B. die Player-Klasse ein Rectangle2D im Bauch haben statt einfach davon zu erben? Und diese seltsame Zuordnung des Mainpanels habe ich ebenfalls mal rausgeworfen.
Wie gesagt es läuft jetzt. ABER: Du wirst mit diesem Ansatz auf keinen grünen Zweig kommen. Ein repaint-Aufruf aus dem KeyListener heraus ist bei einem Spiel eher suboptimal. Bevor ich jetzt alle auseinander pflücke: Klicke mal auf den Link in meiner Signatur, da findest Du ein Beispiel, wie man so etwas aufziehen kann.


----------

