Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Gestione di più eventi da tastiera contemporaneamente

    Allora, innanzitutto anticipo che non posso postare il codice del programma che mi ha dato problemi perché purtroppo è andato perduto.

    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.

    Però ho anche notato una cosa: se i due giocatori premevano contemporaneamente uno dei loro tasti e li tenevano premuti, entrambi si spostavano.

    C'è qualcosa che mi sfugge... come mai accade questo? Che differenza c'è fra queste due situazioni? Come dovrei organizzare il programma per ovviare al problema (in linea generale)?

    Grazie anticipatamente e spero di essermi spiegato anche senza il sorgente.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Gestione di più eventi da tastiera contemporaneamente

    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.
    Ne avevo già parlato tanto tempo fa sul forum (se ritrovo la discussione la linko).
    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Intanto grazie, ma per il timer come dovrei fare più o meno? Dovrei disattivare in qualche modo l'ascoltatore?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.