Gedrückte Tasten abspeichern

timestamp

Mitglied Käsekuchen
Hallo

ich würde gerne sämtliche gedrückte Tasten abspeichern. Beim loslassen soll der Status wieder auf "nicht gedrückt" gesetzt werden.
Meine Frage ist nun, wie ich das am besten realisiere?
ArrayLists fallen für mich glaube ich schon raus, da beim Durchlaufen und gleichzeitiger Manipulation Fehler entstehen können.
Für jede Taste eine extra Variable anzulegen scheint mir zu viel Aufwand.
Übrig bleiben meines Wissens nach da nur noch Arrays.
Nur mit welcher Größe initialisiere ich diese? Wie ermittel ich möglichst einfach danach die gedrückten Tasten? Ein einfaches boolean Array funktioniert leider nicht, da ich neben dem down/up - Status auch noch die downtime benötige. Also ein Array aus folgender Klasse:
Java:
class Key{
  int code, time;
  boolean down;
  //[...]
}

Habt ihr da Ideen/Ansätze zu?
 

Fabio Hellmann

Erfahrenes Mitglied
Hey,

also ich habe auf der java2s-Homepage mal eine tolle Variante gefunden. Die bezieht sich zwar in diesem Kontext auf Spieleprogrammierung, wobei das eigentlich egal sein dürfte.
In diesem Code gibt es zwei für dich relevanten Klassen.
1. InputManager
Alle GameActions werden hier registriert, sodass das KeyEvent an die jeweilige GameAction weitergegeben werden kann.

2. GameAction
In dieser Klasse bzw. in der Instanz davon, wird der Status der Taste gespeichert. Sprich, gedrückt, nicht gedrückt, etc. .


Worauf ich hinaus will: Es macht Sinn, jede Taste als ein Objekt zu sehen und diesem Objekt die Eigenschaften einer Taste zu geben und dementsprechend auch deren Status zu speichern.


Gruß

Fabio
 
Zuletzt bearbeitet:

timestamp

Mitglied Käsekuchen
Es geht in der Tat um die Spieleprogrammierung (eher um eine Engine).
Das Problem ist, das ich die so allgemein wie möglich halten möchte (logisch). Daher reichen mir leider die 4 Pfeiltasten nicht, sondern ich würde gerne alle Tasten zur Verfügung stellen können. Ich habe mich da jetzt gefragt wie ich das möglichst sinnvoll realisiere.
Arrays oder Variablen?
 

Fabio Hellmann

Erfahrenes Mitglied
Du kannst die GameAction-Objekte doch erzeugen, sobald eine Taste gedrückt wird. Diese kannst du z.B. in einer Map ablegen.
Java:
private final Map<Integer, KeyAction> keyActionMap = new HashMap<Integer, KeyAction>();

	@Override
	public void keyPressed(final KeyEvent e) {
		if(!keyActionMap.containsKey(Integer.valueOf(e.getKeyCode()))) {
			keyActionMap.put(Integer.valueOf(e.getKeyCode()), new GameAction(e));
		}
		final GameAction gameAction = keyActionMap.get(Integer.valueOf(e.getKeyCode()));
		gameAction.press();
	}
So erzeugst du dann nur ein GameAction-Objekt, wenn eine Taste zum ersten mal gedrückt wird. Darauf zugreifen kannst du dann z.B. über "KeyEvent.VK_D". Dann kannst du den Status von jeder Taste speziell abfragen. ;)

Gruß

Fabio
 

timestamp

Mitglied Käsekuchen
Danke, genau soetwas habe ich gesucht, wusste bislang gar nicht das es assoziative Arrays in Java gibt :)
Gelöst habe ich es letztendlich so:



Java:
public class EventHandler implements KeyListener{	
	public static HashMap<Integer, Key> keys = new HashMap<Integer, Key>();
	public void keyPressed(KeyEvent e) {
        if( !keys.containsKey( e.getKeyCode()) ) {
            keys.put( e.getKeyCode(), new Key(e.getKeyCode(), true) );
        }       
    }
    public void keyReleased(KeyEvent e){
    	keys.get(e.getKeyCode()).down = false;    		    
    }
    public void keyTyped(KeyEvent e){}
}


Dazu noch eine Frage? Ist das Integer.valueOf() wirklich nötig? Reicht auch (Integer) (type-cast) oder kann ich es ganz weglassen (wie in dem Code oben)?
 

genodeftest

Erfahrenes Mitglied
… ist halt besserer Code-Stil, wenn der Cast explizit angegeben wird. Nötig ist es nicht (meistens). Reduziert aber mögliche Verwirrung ;)