# Problem mit JnR-Steuerung / KeyListener



## TimeIsTheKey (13. Aug 2011)

Hallo

Ich habe gerade ein kleines Problem mit meinem "Jump and Run"-Spiel und ich bin mir unsicher, ob es am KeyListener generell liegt oder an meiner Implementierung.

Ist es normal, das der KeyListener eine kurze "Pause" einlegt, wenn man die Pfeiltasten Links/Rechts bzw. Oben/Runter in irgendeiner Reihenfolge drückt?

Ich habe das Problem, das wenn ich mit dem Spieler nach Rechts laufe und dann Links drücke, der KeyListener eine kurze Pause einlegt und wenn ich während dieser z.B. nach Oben drücke, der Spieler nur noch springt, anstatt nach links zu springen.

Die KeyPressed-Methode ist ganz einfach aufgebaut:


```
public void keyPressed(KeyEvent e) {
		
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			player.setUp(true);
			System.out.println("Up");
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			player.setDown(true);
			System.out.println("Down");
		}
		
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			player.setLeft(true);
			System.out.println("Left");
		}
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			player.setRight(true);
			System.out.println("Right");
		}
		
		if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
			game_running = false;
		}
	}
```

Anhand der prints erkenne ich, ob die Tasten erkannt werden oder eben nicht.

Ich habe keine Ahnung wie ich dem Problem ohne komplexe Lösung vorbeugen soll.
Wobei, eine funktionierende komplexe Lösung fällt mir auch nicht ein :/

Hoffe ihr versteht was ich meine und das ihr irgendeine funktionierende (und wenn möglich einfache) Idee habt!

Edit: Eine Lösung die vielleicht funktionieren könnte (ich hab es noch nicht ganz durchgedacht), wäre die Flags die gesetzt werden jeweils doppelt zu verwenden. Sprich jene für die wirklichen Tasteneingaben und dann welche für die spielinterne Bewegung.

MfG


----------



## Fu3L (13. Aug 2011)

Was genau meinst du mit Pause?
So wie ich das sehe, ist, wenn ich auf die Pfeiltaste 
	
	
	
	





```
<--
```
 drücke left == true. Drücke ich dann auf 
	
	
	
	





```
-->
```
 ist right == true. Die Bewegungen sollten sich also aufheben (oder du müsstest left = false hier schon umsetzen, damit der Char direkt nach rechts geht.. Ich weiß ja nicht, was hinter den Methoden so alles steckt, die du dort verwendest). Wird nun 
	
	
	
	





```
<--
```
 losgelassen, sollte in keyReleased left = false gesetzt werden => Der Char sollte sich nach rechts bewegen.


----------



## TimeIsTheKey (13. Aug 2011)

Ich habe das Problem in der Zwischenzeit schon gelöst.

Probier du mal meine KeyPressed-Methode. Wenn du links drückst und dann rechts, wird in der Konsolenausgabe einen Moment lang nichts ausgegeben. Das meine ich mit Pause. Mit den "doppelten" Flags konnte ich das Problem aber lösen.
Falls du nicht verstehst was mein Problem war, hier ein Konsolenauszug:


```
Right
Left
Right R
Up
UpJump
UpJump
Up
Up
Up
```

Right R ist die loslassen der Pfeiltaste Rechts.
Ich drückte während es noch in dieser Pause war zwischen Links/Rechts nach Oben und da ich die ganze Zeit links/rechts auf falsch setzte, erkannte es links nichts mehr, da ich diese Pause eben ausnutze.

Eine Frage: Der KeyListener erkennt Links/Rechts/Unten gleichzeitig. Links/Rechts/Oben werden aber nicht erkannt. Ist das normal?


----------



## Fu3L (13. Aug 2011)

Ich glaube das hat mit der Tastatur zu tun.. Bei meinen alten PCs hatte ich das auch oft, dass beim Drücken von 3 Tasten gleichzeitg ein Piepen zu hörn war. Nimm mal einen Texteditor wie Notepad++, füll viele Zeilen mit leertasten oder tabs und versuch mal das Caret da mit 3 Tasten gleichzeitig durchzubewegen 

Edit: Tastatur ? Wikipedia Die beiden direkt verlinkten Absätze könnten eine Erklärung liefern.


----------



## TimeIsTheKey (14. Aug 2011)

Fu3L hat gesagt.:


> Ich glaube das hat mit der Tastatur zu tun.. Bei meinen alten PCs hatte ich das auch oft, dass beim Drücken von 3 Tasten gleichzeitg ein Piepen zu hörn war. Nimm mal einen Texteditor wie Notepad++, füll viele Zeilen mit leertasten oder tabs und versuch mal das Caret da mit 3 Tasten gleichzeitig durchzubewegen
> 
> Edit: Tastatur ? Wikipedia Die beiden direkt verlinkten Absätze könnten eine Erklärung liefern.



Also mit Links/Rechts/Unten gehts, aber Links/Rechts/Oben funktioniert nicht. Weiss nun aber nicht mehr weiter. Wenn normale Tastaturen, diese Kombination nicht unterstützen wird sie wahrscheinlich in den meisten Spielen gar nicht drin sein, oder? Oder unterstützen gewöhnliche Tastaturen diese Kombination? :bahnhof:


----------



## Fu3L (14. Aug 2011)

Bisher musste ich in keinem Spiel left, right und up arrow gleichzeitig nutzen. Meistens lässt man ja sowieso die Taste left los, wenn man right beginnt zu drücken, weil man sonst stehen bleibt und dafür kann man gleich alle loslassen^^


----------



## TimeIsTheKey (14. Aug 2011)

Naja, es ist eigentlich auch nicht wirklich erwünscht, dass Links/Rechts/Oben gedrückt wird, aber falls dies der Fall ist, sollte der Spieler logischerweise trotzdem springen.


----------

