Ne avevo già parlato tanto tempo fa sul forum (se ritrovo la discussione la linko).Originariamente inviato da Kaamos
Avevo provato a scrivere in Java il semplice gioco del "muretto" a due giocatori, da un lato uno si muoveva con due tasti e dall'altro lato l'altro giocatore si muoveva con altri due tasti.
Se un giocatore teneva premuto un tasto per lo spostamento il programma continuava ad intercettare l'evento (giustamente) e nel frattempo, se l'altro giocatore provava a premere un tasto, il programma se ne fregava.
Esempio: giocatore uno tiene premuto SU e si sposta, finché non lo rilascia il giocatore due può premere quello che vuole che il gioco se ne frega beatamente.
La grossa questione non è tanto Java (o un'altra applicazione anche "nativa") ma nel modo in cui il S.O. ma sopratutto la tastiera hardware gestisce la pressione/ripetizione dei tasti.
La prova banale: apri una console o anche il semplice "blocco note" di Windows.
Tieni premuto un tasto es. "a". Tenendolo premuto vedrai tante "a" in fila. Ora sempre tenendo premuto "a" inizia a tenere premuto un qualunque altro tasto es. "m". Vedrai che ora è la "m" che si ripete tante volte. Se anche rilasci la "m", la "a" non torna a ripetersi.
Con il blocco note o altro però vedi solo l'effetto finale, non gli eventi effettivi che avvengono a basso livello.
In Java se un componente ha il "focus", può ricevere gli eventi dei tasti. Si può gestire sia la pressione (keyPressed di KeyListener), sia il rilascio (keyReleased di KeyListener).
La sequenza di pressione/rilascio di più tasti sarebbe gestita correttamente, nel senso che se tieni premuto A, poi S, poi D, poi F e alla fine rilasci in senso inverso avresti:
tanti "premuto" A
tanti "premuto" S
tanti "premuto" D
tanti "premuto" F
un "rilasciato" F
un "rilasciato" D
un "rilasciato" S
un "rilasciato" A
Ma è così ... non puoi farci altro, la questione/problema è a monte, nel sistema.
Quindi se ti basta gestire pressione/rilascio puoi farlo anche di più tasti. Se ti serve anche la ripetizione e che sia generale anche per più tasti, devi gestirlo tu con un apposito timer.
E c'è da notare anche un'altra cosa: la tastiera hardware potrebbe essere limitata nella gestione di più tasti contemporanei a seconda di tasti o aree specifiche di tasti.