Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [Java] Gestione KeyEvent simultanei

    Ho programmato un semplice gioco dove bisogna muovere una pallina premendo le freccette, il mio problema è che se premo due tasti simultaneamente la pallina invece di muoversi in diagonale si muove solo in una delle due direzioni tra quelle dei tasti premuti

    Come posso riuscire a gestire due KeyEvent simultanei?
    http://javafactory.altervista.org

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

    Re: [Java] Gestione KeyEvent simultanei

    Originariamente inviato da LuKux
    Ho programmato un semplice gioco dove bisogna muovere una pallina premendo le freccette, il mio problema è che se premo due tasti simultaneamente la pallina invece di muoversi in diagonale si muove solo in una delle due direzioni tra quelle dei tasti premuti

    Come posso riuscire a gestire due KeyEvent simultanei?
    Dire "simultanei" non è corretto ... in quanto comunque gli eventi sono dispacciati 1 per volta.

    Ma c'è un modo per fare quello che chiedi in modo "furbo". Tu puoi ricevere notifica principalmente di 2 eventi: il tasto è stato "premuto" e il tasto è stato "rilasciato". Bene, tieni 4 flag per le 4 direzioni. Quando hai una pressione di una freccia metti a true il corrispondente flag, quando hai il rilascio lo metti a false. Quindi in ogni momento sai quali frecce sono "premute"!!!

    Ma non basta. Se fai la seguente prova scoprirai un problema: tieni sempre premuta la freccia "su" e vedrai che riceverai in sequenza tanti keyPressed (in base alla velocità di ripetizione impostata nel sistema) poi ad un certo punto premi anche un'altra freccia, es. la freccia "sinistra". Ora non riceverai più keyPressed per la freccia "su" ma solo tanti keyPressed per la freccia sinistra. Ad un certo punto rilascia la freccia sinistra. Riceverai ovviamente un keyReleased per questo tasto ma attenzione e qui viene il problema, non riceverai più altro, anche se stai ancora tenendo premuta la freccia "su"!!!

    In questi casi è bene usare un timer (javax.swing.Timer). Appena "senti" che almeno 1 freccia è stata premuta (e ti ricordo che tieni i flag!), fai partire il timer. Quando "senti" che non ci sono più frecce premute fermi il timer.
    Questo tra l'altro ti permette anche di evitare il "delay" della ripetizione della tastiera che può cambiare da sistema a sistema in base alle impostazioni e che in queste situazioni può essere noioso.

    Insomma, come si vedi si può fare benissimo con un pochino di lavoro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.