# Bewegung falsch



## kaetzacoatl (21. Sep 2012)

Hallo,

Ich hab einen Player, der sich auf
einem 2Dimensionalen array bewegt.

Die Bewegung steuere ich so:

```
public void update(GameContainer container, World w) throws SlickException {
		move(getDirection(container, w),w);
	}

	protected void move(int[] is, World w) {
		try {
			if(w.getWorld()[getWorldX(w)+is[0]][getWorldY(w)+is[1]] == null){
				w.getWorld()[getWorldX(w)][getWorldY(w)] = null;
				w.getWorld()[getWorldX(w)+is[0]][getWorldY(w)+is[1]] = this;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
	}

	protected int[] getDirection(GameContainer c, World w) {
		int dx = 0;
		if(c.getInput().isKeyDown(Input.KEY_LEFT))dx--;
		else if(c.getInput().isKeyDown(Input.KEY_RIGHT))dx++;
		int dy = 0;
		try {
			if(w.getWorld()[getWorldX(w)][getWorldY(w)+1] == null)dy++;
			else if(c.getInput().isKeyDown(Input.KEY_SPACE))dy--;
		} catch (ArrayIndexOutOfBoundsException e) {
			w.getWorld()[getWorldX(w)][getWorldY(w)] = null;
		}	
		return new int[]{dx,dy};
	}
```

Doch der Player bewegt sich nur, wenn ich
KEY_RIGHT drücke, und dann nach rechts oben.
Alle anderen Tasten bleiben wirkungslos.

Schonmal Danke


----------



## Marco13 (21. Sep 2012)

```
catch (ArrayIndexOutOfBoundsException e) 
{
System.out.println("Wenn du das hier lesen kannst, weißt du, warum das, was du da geschrieben hast, gröbster Unfug ist");
}
```


----------



## kaetzacoatl (21. Sep 2012)

Die beiden catch Blöcke werden
aber gar nicht aufgerufen.


----------



## Marco13 (21. Sep 2012)

Ich (und vermutlich andere) kann dazu kaum was sagen. Irgendwie würde ich vermuten, dass bei sowas irgendwo Zeilen wie

```
if(c.getInput().isKeyDown(Input.KEY_LEFT)) player.move(-1,0);
if(c.getInput().isKeyDown(Input.KEY_DOWN)) player.move(0,1);
...
```
oder so vorkommen sollten, aber ich wüßte nicht, wie man die Ursache dafür erkennen sollte, dass das, was du geschrieben hast, nicht funktioniert ... vielleicht mal debug-Ausgaben reinmachen...?!

```
System.out.println("Links? "+c.getInput().isKeyDown(Input.KEY_LEFT));
System.out.println("Rechts? "+c.getInput().isKeyDown(Input.KEY_RIGHT));
...
...
System.out.println("Bewegung "+Arrays.toString(is));
```


----------



## kaetzacoatl (21. Sep 2012)

```
w.getWorld()[getWorldX(w)+is[0]][getWorldY(w)+is[1]] = this;
```
is[0] = 1
is[1] = 0
Geht aber trotzdem nach oben


----------



## Qler (21. Sep 2012)

```
int dy = 0;
        try {
            if(w.getWorld()[getWorldX(w)][getWorldY(w)+1] == null)dy++;
            else if(c.getInput().isKeyDown(Input.KEY_SPACE))dy--;
        } catch (ArrayIndexOutOfBoundsException e) {
            w.getWorld()[getWorldX(w)][getWorldY(w)] = null;
        }
```

wenn ich zeile 3 richtig interpretiere, dann erhöhst du 
	
	
	
	





```
dy
```
 um 1, falls 
	
	
	
	





```
w.getWorld(x, y+1) == null
```
 ist...

```
== null
```
 vermut ich mal heist, er kann darauf laufen, dh sollte das feld ?darüber? frei sein, so wird dy auf jeden fall auf 1 gesetzt. 
daran könnte es evtl liegen, dass der player nach oben läuft...

warum er nur nach rechts läuft, puh

probiers mit debug ausgaben!

vielleicht ist dein input fehlerhaft!

[EDIT]
oh, dein beitrag zu spät gesehen... das macht dann wohl meine theorie zunichte...
[/EDIT]


----------



## kaetzacoatl (22. Sep 2012)

Oh, hab ich da was falsch verstanden?
y+1 ist doch eins weiter unten oder nicht?

(0;0)(1;0)(2;0)
(0;1)(1;1)(2;1)
(0;2)(1;2)(2;2)

oder ist das falsch?


----------

