KeyMapping funktioniert nicht

javaman13

Mitglied
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

Java:
	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
 

Anhänge

Zuletzt bearbeitet:
initKeyBindings wird jeden Tick sogar zwei mal aufgerufen...
Warum wird die Methode mehrfach aufgerufen und warum bei jedem Tick? ==> grober Fehler
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.
Code:
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.
 
...
Was ist das andere?
Ich glaube er meinte damit deinen vorschlag mit den Flags ;-)
...
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
Code:
boolean left=false
und in deinem ActionHandler nur
Code:
left=true
bzw beim Loslassen
Code:
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
 

Neue Themen


Zurück
Oben