Evitare di premere i tasti contemporaneamente

di il
5 risposte

Evitare di premere i tasti contemporaneamente

Buongiorno, utilizzando "keydown" su javascript, in questo caso le frecce direzionali, se premute singolarmente non creano problemi, però se premute contemporaneamente viene eseguita un altra azione (es. va dalla parte opposta).
Come faccio ad impedire che vengano rilevati 2 eventi nello stesso istante?
Grazie.

5 Risposte

  • Re: Evitare di premere i tasti contemporaneamente

    Ciao poigneegriffe, benvenuto nel forum!
    Mi piacerebbe aiutarti, ma la domanda che hai fatto è un po' vaga... Che codice usi per catturare l'evento "keydown"? Qual è il tuo obiettivo? (per esempio, non hai specificato chi intendi quando dici "va dalla parte opposta").
    Con qualche indizio in più e parte del codice potremo aiutarti meglio
  • Re: Evitare di premere i tasti contemporaneamente

    Ciao Andrea, grazie mille. Per catturare l'evento "keydown" utilizzo "addEventListener", si tratta di Snake, finchè deve andare in tutte le direzioni non c'è nessun problema, ma ad esempio se lo snake sta andando verso il basso e clicchi contemporaneamente up+left, allora va nella direzione opposta.
    Il codice che utilizzo è il seguente:

    let dir;
    document.addEventListener('keydown', direction);

    function direction(event){
    if(event.keyCode == 37 && dir != 'RIGHT')
    dir = 'LEFT';
    if(event.keyCode == 38 && dir != 'DOWN')
    dir = 'UP';
    if(event.keyCode == 39 && dir != 'LEFT')
    dir = 'RIGHT';
    if(event.keyCode == 40 && dir != 'UP')
    dir = 'DOWN';

    }

    come si nota dal codice, se lo snake va a sinistra e premi il tasto destra, giustamente non andrà nella direzione opposta, però purtroppo cliccando destra+giù o destra+su andrà nella direzione opposta. Volevo sapere se c'è un modo per evitarlo. Se non sono riuscito a spiegarmi posso mandare anche un video.
    Grazie.
  • Re: Evitare di premere i tasti contemporaneamente

    Quando si utilizzano gli event listener, non si può prevenire la comparsa di due eventi se si premono due tasti contemporaneamente.
    Ci sono alcuni modi per risolvere questo problema.
    Il più semplice che mi viene in mente per la tua specifica situazione è fare in modo che, una volta effettuato il controllo, non venga assegnato il valore direttamente alla variabile "dir". Utilizzerei piuttosto una variabile temporanea, e poi l'assegnerei appena prima di calcolare il movimento.

    Questo perché, assegnando subito la variabile 'dir', influenzi il risultato delle successive chiamate al listener.
    
    let dir, tempDir;
    
    document.addEventListener('keydown', direction);
    
    function direction(event){
    	if(event.keyCode == 37 && dir != 'RIGHT')
    		tempDir = 'LEFT';
    	if(event.keyCode == 38 && dir != 'DOWN')
    		tempDir = 'UP';
    	if(event.keyCode == 39 && dir != 'LEFT')
    		tempDir = 'RIGHT';
    	if(event.keyCode == 40 && dir != 'UP')
    		tempDir = 'DOWN';
    }
    
    function calculateNewPosition() {
    	dir = tempDir
    	
    	// Calcola la nuova posizione dello snake
    }
    
    In questo codice si presuppone che stai facendo un remake "classico" del gioco, dove il serpente si muove di blocco in blocco.

    P.S. questa volta avevi poco codice, ma in futuro ti consiglio di usare il bottone che trovi nell'editor del post per formattare correttamente il codice (ha il simbolo </> )
  • Re: Evitare di premere i tasti contemporaneamente

    Ti ringrazio tanto, ho risolto il problema con questo metodo che mi hai mandato. Complimenti
  • Re: Evitare di premere i tasti contemporaneamente

    Contento di essere stato utile, buon progresso con snake
Devi accedere o registrarti per scrivere nel forum
5 risposte