# Problem Steuerung



## Raziell (9. Mai 2010)

Hallo zusammen,
es ist mir fast schon peinlich aber ich hab gerade iwie ein Problem bei der Steuerung von meinem
Spiel. Also ich setzte Flags beim Tastendruck auf true und wenn ich die Taste loslasse auf fals.
In einem Thread wird dann geprüft, welche Taste gedrückt wird und das Objekt dementsprechend
bewegt.


```
private void checkKeys() {
		if (up) {
			jet.setVerticalSpeed(-speed);
			jet.setHorizontalSpeed(0);
			direction = "u";
		}
		if (down) {
			jet.setVerticalSpeed(speed);
			jet.setHorizontalSpeed(0);
			direction = "d";
		}
		if (right) {
			jet.setHorizontalSpeed(speed);
			jet.setVerticalSpeed(0);
			direction = "r";
		}
		if (left) {
			jet.setHorizontalSpeed(-speed);
			jet.setVerticalSpeed(0);
			direction = "l";
		}

		if (!left && !right && !up && !down) {
			jet.setHorizontalSpeed(0);
			jet.setVerticalSpeed(0);
			direction = "s";
		}
		sendDir(direction);
```

Die Direction wird dann an den Server geschickt. Es soll so sein wenn ich z.B. Zuerst
Hoch drücke wird die Figur hoch bewegt, und dann zum Beispiel Links wird die Spielfigur Links bewegt und wenn ich Links loslasse wir die Figur wieder Hoch bewegt. Das funktioniert auch soweit. Das Problem ist, dass wenn ich es so mache das ich z.B. zuerst Links oder rechts drücke und dann Hoch oder runter dann bewegt er sich trotzdem nur nach links bzw. rechts, da ich ja das Hoch und Runter überschrieben weren, weil ich links und rechts ja erst nach hoch und runter prüfe.

Ich hoffe ich habs einigermaßen richtig beschrieben. Wie kann ich das Problem lösen, ich stehe gerade voll aufm Schlauch 

Danke und Grüße


----------



## Antoras (9. Mai 2010)

```
direction += "u";
```
Dann hast du mehrere Zeichen in deinem String, die jeweils eine Richtung angeben. Musst du beim Auslesen dann natürlich beachten.

Oder du machst es so:

```
public class Test {
	public static void main(String argv[]) {
		int RIGHT = 1;
		int LEFT = 2;
		int UP = 4;
		int DOWN = 8;
		
		int dir = RIGHT | DOWN;
		
		if ((dir & RIGHT) == RIGHT) {
			System.out.println("r");
		}
		if ((dir & LEFT) == LEFT) {
			System.out.println("l");
		}
		if ((dir & UP) == UP) {
			System.out.println("u");
		}
		if ((dir & DOWN) == DOWN) {
			System.out.println("d");
		}
	}
}
```
Wichtig dabei ist, dass die Konstanten immer ein Exponent von 2 sind, da die Verknüpfungen sonst nicht mehr funktionieren.


----------



## Raziell (9. Mai 2010)

Hi Antoras,
erstmal Danke für deine Antwort.
Also ich bin jetzt nach gefühlten 10 Std. vom Schlauch runter und hab doch eine Lösung gefunden 

Und zwar speichere ich immer die zwei letzten Tastendrücke in einem Vector, bzw.
lösche Sie nach dem loslassen wieder raus.

Im Thread schaue ich dann, was als letztes gedrückt wurde und führe die dementsprechende
Aktion aus.

Funktioniert auch soweit ich das jetzt beurteilen kann.

Trotzdem Danke für deine Hilfe 

Grüße


----------



## Antoras (9. Mai 2010)

Naja, eine Liste für so etwas primitives zu verwenden halte ich für zu viel Overhead. Gerade bei einem Server-Client-System kann da mit der Zeit schon ein ganz schöner Datenverkehr zusammenkommen, der dann das Programm unnötig ausbremst.
Momentan dürfte das zwar noch nicht stören, aber man sollte ja auch an die Zukunft denken...


----------

