# KeyMapping funktioniert nicht



## javaman13 (4. Nov 2012)

Hallihalo Leute!
Damit euch nicht langweillig wird, haben sich die Fehler gedacht sie tauchen mal wieder in meinem Code auf...
Nun in dem angehängten zip Ordner habt ihr eine (abgespeckte) Version meines Derzeitigen Projekts...

In der Klasse GamePaneln steht folgendes


```
public void initKeyBindings() {
		registerKeyBindings();
		registerActions();
	}

	private void registerActions() {
		getActionMap().put(ACTION_MOVE_UP, new AbstractAction() {
			private static final long	serialVersionUID	= 5426348587436441708L;

			@Override
			public void actionPerformed(ActionEvent e) {
				if(guy.getPositionY() < 900){
					guy.goUp();
				}else{
					bg.offsetY--;
				}
			}
		});
		getActionMap().put(ACTION_MOVE_UP_RELEASE, new AbstractAction() {
			private static final long	serialVersionUID	= 2994359553272125493L;

			@Override
			public void actionPerformed(ActionEvent e) {

			}
		});

		getActionMap().put(ACTION_MOVE_DOWN, new AbstractAction() {
			private static final long	serialVersionUID	= 2994359553272125493L;

			@Override
			public void actionPerformed(ActionEvent e) {
				if(guy.getPositionY() < 900){
					guy.goDown();
				}else{
					bg.offsetY++;
				}
			}
		});
		getActionMap().put(ACTION_MOVE_DOWN_RELEASE, new AbstractAction() {
			private static final long	serialVersionUID	= -8636084771621154826L;

			@Override
			public void actionPerformed(ActionEvent e) {

			}
		});

		getActionMap().put(ACTION_MOVE_LEFT, new AbstractAction() {
			private static final long	serialVersionUID	= -62225967313922399L;

			@Override
			public void actionPerformed(ActionEvent e) {
				if(guy.getPositionX() < 900){
					guy.goLeft();
				}else{
					bg.offsetX++;
				}
			}
		});
		getActionMap().put(ACTION_MOVE_LEFT_RELEASE, new AbstractAction() {
			private static final long	serialVersionUID	= -8689482841732245L;

			@Override
			public void actionPerformed(ActionEvent e) {

			}
		});

		getActionMap().put(ACTION_MOVE_RIGHT, new AbstractAction() {
			private static final long	serialVersionUID	= -8636084771621154826L;

			@Override
			public void actionPerformed(ActionEvent e) {
				if(guy.getPositionX() < 900){
					guy.goRight();
				}else{
					bg.offsetX--;
				}
			}
		});
		getActionMap().put(ACTION_MOVE_RIGHT_RELEASE, new AbstractAction() {
			private static final long	serialVersionUID	= -5590511117183328264L;

			@Override
			public void actionPerformed(ActionEvent e) {

			}
		});
	}

	private void registerKeyBindings() {
		getInputMap().put(KeyStroke.getKeyStroke("W"), ACTION_MOVE_UP);
		getInputMap().put(KeyStroke.getKeyStroke("released W"), ACTION_MOVE_UP_RELEASE);
		getInputMap().put(KeyStroke.getKeyStroke("S"), ACTION_MOVE_DOWN);
		getInputMap().put(KeyStroke.getKeyStroke("released S"), ACTION_MOVE_DOWN_RELEASE);
		getInputMap().put(KeyStroke.getKeyStroke("A"), ACTION_MOVE_LEFT);
		getInputMap().put(KeyStroke.getKeyStroke("released A"), ACTION_MOVE_LEFT_RELEASE);
		getInputMap().put(KeyStroke.getKeyStroke("D"), ACTION_MOVE_RIGHT);
		getInputMap().put(KeyStroke.getKeyStroke("released D"), ACTION_MOVE_RIGHT_RELEASE);
	}
```

initKeyBindings wird jeden Tick sogar zwei mal aufgerufen...

meine Frage ist, warum funktioniert es nicht?

Danke jetzt schn mal

EDIT: Bilder Vergessen 
So gemacht das man ProjectOmega.zip einfach nur in C:// entpacken muss


----------



## Michael... (5. Nov 2012)

javaman13 hat gesagt.:


> initKeyBindings wird jeden Tick sogar zwei mal aufgerufen...


Warum wird die Methode mehrfach aufgerufen und warum bei jedem Tick? ==> grober Fehler


javaman13 hat gesagt.:


> meine Frage ist, warum funktioniert es nicht?


Meine Frage ist, was funktioniert nicht?

Die InputMap, die Du per getInputMap() holst, gilt nur wenn die Komponente den Fokus hat. Evtl. 
	
	
	
	





```
getInputMap(int)
```
 verwenden - oder sicherstellen, dass die Komponente den Fokus hat.

Der rudimentäre Code lässt vermuten, dass die Bewegung ausgeführt werden soll, solange die Tasten gedrückt werden. Hier müsste man mit Flags o.ä. arbeiten. Die Berechnung der Bewegung würde ich dann ohnehin an zentraler Stelle implementieren.


----------



## javaman13 (5. Nov 2012)

okay, mal nur einmal pro tick ausführen... 
aber wie meinst du das andere?


----------



## Michael... (6. Nov 2012)

javaman13 hat gesagt.:


> okay, mal nur einmal pro tick ausführen...


Nein, insgesamt nur einmal ausführen. Es reicht ja auch einmal die Key Bindings zu setzen, die gehen ja durch benutzen nicht kaputt.


javaman13 hat gesagt.:


> aber wie meinst du das andere?


Was ist das andere?


----------



## javaman13 (6. Nov 2012)

Achso... nur einmal aufrufen dann funktionierts ;D danke...
(so ein blöder fehler!)


----------



## TryToHelp (6. Nov 2012)

Michael... hat gesagt.:


> ...
> Was ist das andere?


Ich glaube er meinte damit deinen vorschlag mit den Flags ;-)


Michael... hat gesagt.:


> ...
> Der rudimentäre Code lässt vermuten, dass die Bewegung ausgeführt werden soll, solange die Tasten gedrückt werden. Hier müsste man mit Flags o.ä. arbeiten. Die Berechnung der Bewegung würde ich dann ohnehin an zentraler Stelle implementieren.



Was Michael... damit meint, ist, das du nicht in dem Listener die Aktion machen sollst, sondern beim Drücken, bzw beim Relesen eine Variable z.B. eine boolean setzen sollst (als Flag für gedrückt nicht gedrückt nehmen sollst)

Also sowas wie 
	
	
	
	





```
boolean left=false
```
 und in deinem ActionHandler nur 
	
	
	
	





```
left=true
```
 bzw beim Loslassen 
	
	
	
	





```
left=false
```
 und deine Berechnungen und co an anderer Stelle, z.B. in deiner Gameloop, oder der function calcNewPosition oder wie auch immer, ausführst


----------

