# auf Mapraster frei bewegen



## Krypthor (7. Feb 2012)

Hi,
hab mal eine kleine Frage, und zwar hab ich mir eine Map mit 





> public char[][] initArray()


erstellt, allerdings kann der Charakter auch immer nur von Feld zu Feld rücken.
Kann man den Charakter jedoch auch nicht Feldweise, sondern Pixelweise bewegen, er aber dann trotzdem die Wände als Wände erkennt und nicht drüberläuft?

Mfg,

Krypthor


----------



## Apo (7. Feb 2012)

Ja kann man. =)

Ich löse es immer folgendermaßen:
Spieler hat einen X-Wert, einen Y-Wert, Breite und Höhe. Außerdem noch eine Geschwindigkeit in x- und y-Richtung.
Jedes Feld hat eine bestimmt Breite und Höhe. 
Wenn der Player nun nach rechts gehen will, erhöhe ich bei jedem Update den x-Wert des Spielers um die Geschwindigkeit in x-Richtung. 
Wenn der (neue X-Wert des Spielers + Breite des Spielers) / die Breite der einzelnen Felder ungleich zu dem (alten X-Wert + Breite des Spielers) / Breite der einzelnen Felder ist, dann weiß ich er ist auf einem neuen Feld angekommen und kann dann schauen was ich machen will. 
Nach links wäre es halt: (neuer X-Wert des Spielers) / die Breite der einzelnen Felder ungleich zu dem (alten X-Wert) / Breite der einzelnen Felder.
Analog halt für die y-Werte. Damit fahre ich eigentlich immer ganz gut.
Ich hoffe ich habe es verständlich ausgedrückt. =)


----------



## Krypthor (7. Feb 2012)

Ich habs noch nicht ganz verstandern,
wie soll das Programm erkennen, auf welchem Feld man sich den gerade bewegt?
hier ist mal meine Map:

```
public class Map extends JPanel implements ActionListener{
Player p;
Timer time, time2, time3;
char[][] array;
int m, n, p1, p2, a, q;
ImageIcon i1 = new ImageIcon("Ziel.png");
Image img1 = i1.getImage();
ImageIcon i2 = new ImageIcon("Kugel.png");
Image img2 = i2.getImage();
ImageIcon i3 = new ImageIcon("Baum.png");
Image img3 = i3.getImage();
Random r = new Random();

	public Map(){
		time = new Timer(10, this); 
		time.start();
		p = new Player();
		addKeyListener(new AL());
		setFocusable(true);
		a = 22;
		p1 = 3;
		p2 = 4;
		q = r.nextInt(1 + 2) - 1;
	}
	public char[][] initArray(){
		char[][] ch = new char[17][17];
		ch[0][0] = '-';ch[1][0] = '-';ch[2][0] = '-';ch[3][0] = '-';ch[4][0] = '-';ch[5][0] = '-';ch[6][0] = '-';ch[7][0] = '-';ch[8][0] = '-';ch[9][0] = '-';ch[10][0] = '-';ch[11][0] = '-';ch[12][0] = '-';ch[13][0] = '-';ch[14][0] = '-';ch[15][0] = '-';ch[16][0] = '-';
		ch[0][1] = '-';ch[1][1] = '-';ch[2][1] = '-';ch[3][1] = ' ';ch[4][1] = ' ';ch[5][1] = ' ';ch[6][1] = '-';ch[7][1] = '-';ch[8][1] = '-';ch[9][1] = ' ';ch[10][1] = ' ';ch[11][1] = ' ';ch[12][1] = ' ';ch[13][1] = '-';ch[14][1] = '-';ch[15][1] = '-';ch[16][1] = '-';
		ch[0][2] = '-';ch[1][2] = '-';ch[2][2] = ' ';ch[3][2] = ' ';ch[4][2] = ' ';ch[5][2] = ' ';ch[6][2] = ' ';ch[7][2] = '-';ch[8][2] = ' ';ch[9][2] = ' ';ch[10][2] = ' ';ch[11][2] = ' ';ch[12][2] = ' ';ch[13][2] = ' ';ch[14][2] = '-';ch[15][2] = '-';ch[16][2] = '-';
		ch[0][3] = '-';ch[1][3] = ' ';ch[2][3] = ' ';ch[3][3] = ' ';ch[4][3] = ' ';ch[5][3] = ' ';ch[6][3] = ' ';ch[7][3] = ' ';ch[8][3] = ' ';ch[9][3] = ' ';ch[10][3] = ' ';ch[11][3] = ' ';ch[12][3] = ' ';ch[13][3] = ' ';ch[14][3] = ' ';ch[15][3] = '-';ch[16][3] = '-';
		ch[0][4] = '-';ch[1][4] = ' ';ch[2][4] = ' ';ch[3][4] = ' ';ch[4][4] = ' ';ch[5][4] = ' ';ch[6][4] = ' ';ch[7][4] = ' ';ch[8][4] = ' ';ch[9][4] = ' ';ch[10][4] = ' ';ch[11][4] = ' ';ch[12][4] = ' ';ch[13][4] = ' ';ch[14][4] = ' ';ch[15][4] = ' ';ch[16][4] = '-';
		ch[0][5] = '-';ch[1][5] = ' ';ch[2][5] = ' ';ch[3][5] = ' ';ch[4][5] = ' ';ch[5][5] = ' ';ch[6][5] = ' ';ch[7][5] = ' ';ch[8][5] = ' ';ch[9][5] = ' ';ch[10][5] = ' ';ch[11][5] = ' ';ch[12][5] = ' ';ch[13][5] = ' ';ch[14][5] = ' ';ch[15][5] = ' ';ch[16][5] = '-';
		ch[0][6] = '-';ch[1][6] = ' ';ch[2][6] = ' ';ch[3][6] = ' ';ch[4][6] = ' ';ch[5][6] = ' ';ch[6][6] = ' ';ch[7][6] = ' ';ch[8][6] = ' ';ch[9][6] = ' ';ch[10][6] = ' ';ch[11][6] = ' ';ch[12][6] = ' ';ch[13][6] = ' ';ch[14][6] = ' ';ch[15][6] = ' ';ch[16][6] = '-';
		ch[0][7] = '-';ch[1][7] = '-';ch[2][7] = ' ';ch[3][7] = ' ';ch[4][7] = ' ';ch[5][7] = ' ';ch[6][7] = ' ';ch[7][7] = ' ';ch[8][7] = ' ';ch[9][7] = ' ';ch[10][7] = ' ';ch[11][7] = ' ';ch[12][7] = ' ';ch[13][7] = ' ';ch[14][7] = ' ';ch[15][7] = ' ';ch[16][7] = '-';
		ch[0][8] = '-';ch[1][8] = '-';ch[2][8] = '-';ch[3][8] = ' ';ch[4][8] = ' ';ch[5][8] = ' ';ch[6][8] = ' ';ch[7][8] = ' ';ch[8][8] = ' ';ch[9][8] = '-';ch[10][8] = ' ';ch[11][8] = ' ';ch[12][8] = ' ';ch[13][8] = ' ';ch[14][8] = ' ';ch[15][8] = '-';ch[16][8] = '-';
		ch[0][9] = '-';ch[1][9] = '-';ch[2][9] = '-';ch[3][9] = '-';ch[4][9] = ' ';ch[5][9] = ' ';ch[6][9] = ' ';ch[7][9] = ' ';ch[8][9] = '-';ch[9][9] = '-';ch[10][9] = '-';ch[11][9] = ' ';ch[12][9] = ' ';ch[13][9] = ' ';ch[14][9] = '-';ch[15][9] = '-';ch[16][9] = '-';
		ch[0][10] = '-';ch[1][10] = '-';ch[2][10] = '-';ch[3][10] = '-';ch[4][10] = '-';ch[5][10] = '-';ch[6][10] = '-';ch[7][10] = '-';ch[8][10] = '-';ch[9][10] = '-';ch[10][10] = '-';ch[11][10] = '-';ch[12][10] = '-';ch[13][10] = '-';ch[14][10] = '-';ch[15][10] = '-';ch[16][10] = '-';
		return ch;
	}
	
	public void actionPerformed(ActionEvent e) {
		repaint();
		playerMove();
		checkCollisions();
	}
	
	public void playerMove(){
		if(p.getRX() == -1 && array[p1 - 1][p2] != '-' && p.bewegen == true){
			p1 = p1 - 1;
			p.bewegen = false;
		}
		if(p.getRX() == +1 && array[p1 + 1][p2] != '-' && p.bewegen == true){
			p1 = p1 + 1;
			p.bewegen = false;
		}
		if(p.getRY() == -1 && array[p1][p2 - 1] != '-' && p.bewegen == true){
			p2 = p2 - 1;
			p.bewegen = false;
		}
		if(p.getRY() == +1 && array[p1][p2 + 1] != '-' && p.bewegen == true){
			p2 = p2 + 1;
			p.bewegen = false;
		}
	}
	

	public void checkCollisions(){
	}
	public void paint(Graphics g) {
		
		super.paint(g);
			Graphics2D g2d = (Graphics2D) g;
			array = initArray();
			for(int n=0 ; n < 17; n++){
				for(int m=0; m < 17; m++){
					
					if(array[m][n] == '-'){
						if(q == 1){
							g2d.drawImage(img3, a*m, a*n, null);
						}
						if(q == 0){
							g2d.drawImage(img2, a*m, a*n, null);
						}
						if(q == - 1){
							g2d.drawImage(img3, a*m, a*n, null);
						}
					}
				}
			}
			g2d.drawImage(img1, a*p1, a*p2, null);
	}
	
	private class AL extends KeyAdapter{
		public void keyPressed(KeyEvent e){
			int key = e.getKeyCode(); 
		
			if (key == KeyEvent.VK_LEFT){
				p.richtungx = - 1;
				p.richtungy = 0;
			}
			if (key == KeyEvent.VK_RIGHT){
				p.richtungx = + 1;
				p.richtungy = 0;
			}
			if (key == KeyEvent.VK_UP){
				p.richtungx = 0;
				p.richtungy = - 1;
			}
			if (key == KeyEvent.VK_DOWN){
				p.richtungx = 0;
				p.richtungy = + 1;
			}
		}
		public void keyReleased(KeyEvent e){
			int key = e.getKeyCode(); 
		
			if (key == KeyEvent.VK_LEFT){
				p.richtungx = 0;
				p.richtungy = 0;
				p.bewegen = true;
			}
			if (key == KeyEvent.VK_RIGHT){ 
				p.richtungx = 0;
				p.richtungy = 0;
				p.bewegen = true;
			}
			if (key == KeyEvent.VK_UP){
				p.richtungy = 0;
				p.richtungx = 0;
				p.bewegen = true;
			}
			if (key == KeyEvent.VK_DOWN){
				p.richtungy = 0;
				p.richtungx = 0;
				p.bewegen = true;
			}
		}
	}
}
```
und der Player:

```
public class Player{
	int x, y, dx, dy, nx, nx2, left, richtungs;
	int richtung, magazin, magazinMP, waffe, richtungy, richtungx;
	boolean löschen;
	Map map;
	int m, n, ny, mx;
	boolean bewegen, bau;
	
	public Player(){
		richtungx = 0;
		richtungy = 0;
		bewegen = true;
		bau = false;
	}
	
	public int Richtung(){
		return richtung;
	}
	public int getRX(){
		return richtungx;
	}
	public int getRY(){
		return richtungy;
	}
}
```


----------



## Apo (8. Feb 2012)

Wenn ich den Code sehe, rate ich dir mal Quaxlis Tutorial dir anzuschauen und durchzugehen. Bei dir fehlt noch der eigentliche gameloop. Also ein Thread, welcher alle x Millisekunden Sachen bewegt und neu zeichnet. Du zeichnest derzeit immer wenn du eine Taste gedrückt hast.
Um eine flüssige Bewegung hinzubekommen, wird aber schon ein gameloop benötigt. Schau dir Quaxlis Tutorial mal an und arbeite es langsam durch.

Danach verstehst du hoffentlich wie ich es meinte mit dein Spieler brauch einen x-Wert, y-Wert, eine Breite und Höhe. Hat Quaxli in seiner Sprite Klasse alles mit drin und auch die Bewegung und die Logik dazu.


----------



## Krypthor (8. Feb 2012)

Aber das hab ich doch?! Bei mir wird alles alle 10 Millisekunden aktualisiert:

```
public class Map extends JPanel implements ActionListener{
...
time = new Timer(10, this); 
...
```


----------



## GUI-Programmer (8. Feb 2012)

Ja, stimmt. Allerdings solltest du anstatt der paint - die paintComponent - Methode überschreiben. Zudem solltest du in deiner Klasse Player auch die nötigen Setter zu die Getter hinzufügen. In der paintComponent dann kannst du entsprechend dann das Bild an der richtigen Stelle mit der richtigen Größe zeichnen. Vielleicht wäre es daher schon mal sinnvoll wenn Player von Rectangle erbt.

Schau dir mal Figuren Zeichner aus meiner Signatur an. Vieleicht hilft dir das auch weiter.


----------



## tdc (8. Feb 2012)

Oder schau dir, wie Apo bereits vorgeschlagen hat, einfach mal Quaxli's Tutorial an. Dort lernt man wirklich alle nötigen Grundlagen für 2D-Spiele und es wird dir sicherlich weiterhelfen.
Dort lernst du auch eine grobe Grundstruktur, die dir einiges erleichtern wird.


----------



## Krypthor (16. Feb 2012)

So, ich hab das jetzt teilweise hinbekommen, jedoch hab ich noch das Problem, dass das aktuelle Kästchen auf dem sich der Spieler befindet beispielsweise immer um eins nach links bewegt, wenn der Spieler links über den aktuellen Kästchen Wert kommt. Und wenn das Kästchen - 1 auf eine Wand stoßen würde kann der Spieler sich nicht mehr in die Richtung bewegen, egal ob er schon an der Wand angekommen ist oder noch nicht ganz. Das hab ich schon versucht wegzubekommen, bisher jedoch ohne Erfolg. 

Hier mal meine aktuelle Klasse der Map:

```
public class Map extends JPanel implements ActionListener{
Player p;
boolean test;
Timer time, time2, time3;
char[][] array;
int m, n, p1, p2, a, q, x, y;
ImageIcon i1 = new ImageIcon("Ziel.png");
Image img1 = i1.getImage();
ImageIcon i2 = new ImageIcon("Kugel.png");
Image img2 = i2.getImage();
ImageIcon i3 = new ImageIcon("Baum.png");
Image img3 = i3.getImage();
ImageIcon i4 = new ImageIcon("img.png");
Image img4 = i4.getImage();
Random r = new Random();

	public Map(){
		time = new Timer(10, this); 
		time.start();
		p = new Player();
		addKeyListener(new AL());
		setFocusable(true);
		a = 22;
		p1 = 3;
		p2 = 3;
		x = 70;
		y = 70;
		q = r.nextInt(1 + 2) - 1;
	}
	public char[][] initArray(){
		char[][] ch = new char[17][17];
		ch[0][0] = '-';ch[1][0] = '-';ch[2][0] = '-';ch[3][0] = '-';ch[4][0] = '-';ch[5][0] = '-';ch[6][0] = '-';ch[7][0] = '-';ch[8][0] = '-';ch[9][0] = '-';ch[10][0] = '-';ch[11][0] = '-';ch[12][0] = '-';ch[13][0] = '-';ch[14][0] = '-';ch[15][0] = '-';ch[16][0] = '-';
		ch[0][1] = '-';ch[1][1] = '-';ch[2][1] = '-';ch[3][1] = ' ';ch[4][1] = ' ';ch[5][1] = ' ';ch[6][1] = '-';ch[7][1] = '-';ch[8][1] = '-';ch[9][1] = ' ';ch[10][1] = ' ';ch[11][1] = ' ';ch[12][1] = ' ';ch[13][1] = '-';ch[14][1] = '-';ch[15][1] = '-';ch[16][1] = '-';
		ch[0][2] = '-';ch[1][2] = '-';ch[2][2] = ' ';ch[3][2] = ' ';ch[4][2] = ' ';ch[5][2] = ' ';ch[6][2] = ' ';ch[7][2] = '-';ch[8][2] = ' ';ch[9][2] = ' ';ch[10][2] = ' ';ch[11][2] = ' ';ch[12][2] = ' ';ch[13][2] = ' ';ch[14][2] = '-';ch[15][2] = '-';ch[16][2] = '-';
		ch[0][3] = '-';ch[1][3] = ' ';ch[2][3] = ' ';ch[3][3] = ' ';ch[4][3] = ' ';ch[5][3] = ' ';ch[6][3] = ' ';ch[7][3] = ' ';ch[8][3] = ' ';ch[9][3] = ' ';ch[10][3] = ' ';ch[11][3] = ' ';ch[12][3] = ' ';ch[13][3] = ' ';ch[14][3] = ' ';ch[15][3] = '-';ch[16][3] = '-';
		ch[0][4] = '-';ch[1][4] = ' ';ch[2][4] = ' ';ch[3][4] = ' ';ch[4][4] = ' ';ch[5][4] = ' ';ch[6][4] = ' ';ch[7][4] = ' ';ch[8][4] = ' ';ch[9][4] = ' ';ch[10][4] = ' ';ch[11][4] = ' ';ch[12][4] = ' ';ch[13][4] = ' ';ch[14][4] = ' ';ch[15][4] = ' ';ch[16][4] = '-';
		ch[0][5] = '-';ch[1][5] = ' ';ch[2][5] = ' ';ch[3][5] = ' ';ch[4][5] = ' ';ch[5][5] = ' ';ch[6][5] = ' ';ch[7][5] = ' ';ch[8][5] = ' ';ch[9][5] = ' ';ch[10][5] = ' ';ch[11][5] = ' ';ch[12][5] = ' ';ch[13][5] = ' ';ch[14][5] = ' ';ch[15][5] = ' ';ch[16][5] = '-';
		ch[0][6] = '-';ch[1][6] = ' ';ch[2][6] = ' ';ch[3][6] = ' ';ch[4][6] = ' ';ch[5][6] = ' ';ch[6][6] = ' ';ch[7][6] = ' ';ch[8][6] = ' ';ch[9][6] = ' ';ch[10][6] = ' ';ch[11][6] = ' ';ch[12][6] = ' ';ch[13][6] = ' ';ch[14][6] = ' ';ch[15][6] = ' ';ch[16][6] = '-';
		ch[0][7] = '-';ch[1][7] = '-';ch[2][7] = ' ';ch[3][7] = ' ';ch[4][7] = ' ';ch[5][7] = ' ';ch[6][7] = ' ';ch[7][7] = ' ';ch[8][7] = ' ';ch[9][7] = ' ';ch[10][7] = ' ';ch[11][7] = ' ';ch[12][7] = ' ';ch[13][7] = ' ';ch[14][7] = ' ';ch[15][7] = ' ';ch[16][7] = '-';
		ch[0][8] = '-';ch[1][8] = '-';ch[2][8] = '-';ch[3][8] = ' ';ch[4][8] = ' ';ch[5][8] = ' ';ch[6][8] = ' ';ch[7][8] = ' ';ch[8][8] = ' ';ch[9][8] = '-';ch[10][8] = ' ';ch[11][8] = ' ';ch[12][8] = ' ';ch[13][8] = ' ';ch[14][8] = ' ';ch[15][8] = '-';ch[16][8] = '-';
		ch[0][9] = '-';ch[1][9] = '-';ch[2][9] = '-';ch[3][9] = '-';ch[4][9] = ' ';ch[5][9] = ' ';ch[6][9] = ' ';ch[7][9] = ' ';ch[8][9] = '-';ch[9][9] = '-';ch[10][9] = '-';ch[11][9] = ' ';ch[12][9] = ' ';ch[13][9] = ' ';ch[14][9] = '-';ch[15][9] = '-';ch[16][9] = '-';
		ch[0][10] = '-';ch[1][10] = '-';ch[2][10] = '-';ch[3][10] = '-';ch[4][10] = '-';ch[5][10] = '-';ch[6][10] = '-';ch[7][10] = '-';ch[8][10] = '-';ch[9][10] = '-';ch[10][10] = '-';ch[11][10] = '-';ch[12][10] = '-';ch[13][10] = '-';ch[14][10] = '-';ch[15][10] = '-';ch[16][10] = '-';
		return ch;
	}
	
	public void actionPerformed(ActionEvent e) {
		repaint();
		playerMove();
		checkCollisions();
	}
	
	public void playerMove(){
		if(p.getRX() == -1 && array[p1 - 1][p2] != '-' && p.bewegen == true){
			//p1 = p1 - 1;
			x = x - 1;
		}
		if(p.getRX() == +1 && array[p1 + 1][p2] != '-' && p.bewegen == true){
			//p1 = p1 + 1;
			x = x + 1;
		}
		if(p.getRY() == -1 && array[p1][p2 - 1] != '-' && p.bewegen == true){
			//p2 = p2 - 1;
			y = y - 1;
		}
		if(p.getRY() == +1 && array[p1][p2 + 1] != '-' && p.bewegen == true){
			//p2 = p2 + 1;
			y = y + 1;
		}
	}
	

	public void checkCollisions(){
		if(x < a*p1){
			p1 = p1 - 1;
		}
		if(x > a*p1){
			p1 = p1 + 1;
		}
		if(y > a*p2){
			p2 = p2 + 1;
		}
		if(y < a*p2){
			p2 = p2 - 1;
		}
		System.out.println("p1 = " + a*p1 + " p2 = " + a*p2);
		System.out.println("x = " + x + " y = " + y);
	}
	public void paint(Graphics g) {
		
		super.paint(g);
			Graphics2D g2d = (Graphics2D) g;
			array = initArray();
			for(int n=0 ; n < 17; n++){
				for(int m=0; m < 17; m++){
					
					if(array[m][n] == '-'){
						if(q == 1){
							g2d.drawImage(img3, a*m, a*n, null);
						}
						if(q == 0){
							g2d.drawImage(img2, a*m, a*n, null);
						}
						if(q == - 1){
							g2d.drawImage(img3, a*m, a*n, null);
						}
					}
				}
			}
			g2d.drawImage(img4, x, y, null);
			g2d.drawImage(img1, a*p1, a*p2, null);
	}
	
	private class AL extends KeyAdapter{
		public void keyPressed(KeyEvent e){
			int key = e.getKeyCode(); 
		
			if (key == KeyEvent.VK_LEFT){
				p.richtungx = - 1;
				p.richtungy = 0;
			}
			if (key == KeyEvent.VK_RIGHT){
				p.richtungx = + 1;
				p.richtungy = 0;
			}
			if (key == KeyEvent.VK_UP){
				p.richtungx = 0;
				p.richtungy = - 1;
			}
			if (key == KeyEvent.VK_DOWN){
				p.richtungx = 0;
				p.richtungy = + 1;
			}
		}
		public void keyReleased(KeyEvent e){
			int key = e.getKeyCode(); 
		
			if (key == KeyEvent.VK_LEFT){
				p.richtungx = 0;
				p.richtungy = 0;
				p.bewegen = true;
			}
			if (key == KeyEvent.VK_RIGHT){ 
				p.richtungx = 0;
				p.richtungy = 0;
				p.bewegen = true;
			}
			if (key == KeyEvent.VK_UP){
				p.richtungy = 0;
				p.richtungx = 0;
				p.bewegen = true;
			}
			if (key == KeyEvent.VK_DOWN){
				p.richtungy = 0;
				p.richtungx = 0;
				p.bewegen = true;
			}
		}
	}
}
```

Was muss ich am besten umändern?


----------

