# Kann nur nach rechts drehen



## Mr. Moon (11. Sep 2014)

Hallo,

Ich habe für mein Spielprojekt einen KeyListener implementiert, der eigentlich auch funktioniert. Die Steuerung sieht so aus, dass wenn ich die linke oder rechte Pfeiltaste drücke, ich mich nach links oder rechts drehe und wenn ich die obere Pfeiltaste drücke, ich laufe. Das funktioniert auch einwandfrei, aber wenn ich zusätzlich noch die Leertaste drücke(zum Feuern), dann kann ich mich auf einmal nur noch rechtsherum drehen. Ich kann mir nicht erklären woran es liegt. Hier mein Code:


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


public class Controls implements KeyListener {

	private Hero hero;
	
	public Controls(Hero hero) {
		
		this.hero = hero;
	}
	
	
	
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
		if(e.getKeyCode() == KeyEvent.VK_SPACE) {
			hero.setFire(true);
			
		}
		
		if(e.getKeyCode() == KeyEvent.VK_UP) {
			hero.setUp(true);
			
		}
		
		if(e.getKeyCode() == KeyEvent.VK_DOWN) {
			hero.setDown(true);
		}
		
		if(e.getKeyCode() == KeyEvent.VK_LEFT) {
			hero.setLeft(true);
		}
		
		if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
			hero.setRight(true);
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
		if(e.getKeyCode() == KeyEvent.VK_SPACE) {
			hero.setFire(false);
			
		}
		
		if(e.getKeyCode() == KeyEvent.VK_UP) {
			hero.setUp(false);
		}
		
		if(e.getKeyCode() == KeyEvent.VK_DOWN) {
			hero.setDown(false);
		}
		
		if(e.getKeyCode() == KeyEvent.VK_LEFT) {
			hero.setLeft(false);
		}
		
		if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
			hero.setRight(false);
		}
	}

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

}
```


```
public class Hero extends Sprite {

	private boolean up;
	private boolean down;
	private boolean left;
	private boolean right;
        private boolean fire;
    
	private GameField gf;
	private Tile[][] tilemap;

.....

public void checkKeys(long delta) {
		
		if(!left && right) {
			rotate(delta, true, 2);
		}
		
		if(left && !right) {
			rotate(delta, false, 2);
		}
		
		if(up && !down) {
			gf.scrollMap(delta, 100000, direction);
		}
		
		if(!up && down) {
			gf.scrollMap(delta, -100000, direction);
		}
		
		if(!up && !down) {
			
			dx = 0;
			dy = 0;
		}
	}
	@Override
	public void doLogic(long delta) {
		// TODO Auto-generated method stub
		super.doLogic(delta);
		
		checkKeys(delta);
		limitMap();
	}
}
```


```
public abstract class Sprite extends Rectangle2D.Double implements Drawable, Movable {

	
	protected double dx;
	protected double dy;

....

protected void rotate(long delta, boolean rotRight, int skip) {
		
		if(rotRight) {
			direction = (direction + 1 + skip) % images.length;
		}
		
		else {
			
			direction = direction - 1 - skip;
			
			if(direction < 0) {
				direction = images.length + direction;
			}
		}
	}
```

Vielen Dank für jede Hilfe.


----------



## eMmiE (11. Sep 2014)

Such mal Codestellen, in denen du abfragst, ob die Spielfigur gerade schießt oder nicht, die auch im Zusammenhang mit der Drehung stehen

Das hier sollte eigentlich funktionieren, nach deiner Beschreibung

Gruß eMmiE


----------



## Mr. Moon (11. Sep 2014)

Also ich hab jetzt mal sowohl die Key Abfrage der Leertaste in Controls als auch alle Sachen die mit dem Feuern zusammenhängen auskommentiert. Das Problem bleibt bestehen. Wenn ich die Leertaste gedrückt halte, kann ich die Spielfigur nicht linksherum drehen :/


----------



## eMmiE (11. Sep 2014)

Wird das Event nicht erkannt, wenn die Leertaste gedrückt wurde oder wird linksrum nur nicht ausgeführt
Es kann mit dem gleichzeitigen drücken von Tasten zusammenhängen, dass einzelne nicht mehr erkannt werden

Tipp:
Wenn du erkannt hast, um welche Taste es sich handelt kannst du die Methode auch einfach mit einem "return;" beenden

Gruß eMmiE


----------



## Mr. Moon (11. Sep 2014)

Das Event wird garnicht erkannt


----------



## eMmiE (12. Sep 2014)

Ich mache das immer so, dass ich ein boolean Array habe mit einer boolean für jede (benötigte) Taste und bei jedem Tastendruck abfrage, ob der KeyCode dem der zugehörigen boolean entspricht

Mit den VK_... Methoden habe ich bis jetzt noch gar nicht gearbeitet
Kannst ja einfach mal probieren, das so zu machen, aber ich kann nichts garantieren 

Gruß eMmiE


----------



## Eichelhäer (11. Jul 2015)

Hallo,

versuch kein einfaches if beim Listener und bei der update zu verwenden sondern ein else if dann sollte es gehen.

Gruß Eichelhäer


----------



## eMmiE (11. Jul 2015)

Wenn das dein ganzer Code ist, dann fehlt eine Zeile im Konstruktor, nämlich da, wo du den KeyListener einbindest

this.addKeyListener(this);

hört sich erstmal megasinnvoll an, weil man ja quasi der Klasse sich selbst zufügt, aber das geht einfach darum, dass die Klasse den KeyListener schließlich nutzen kann
Hoffe, dass das das Problem war 

Gruß eMmiE


----------

