es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

setTimeout siendo llamado múltiples veces

No puedo entender por qué setTimeout se está llamando varias veces en mi código.
Aquí hay un fragmento del código con lo que pensé que era irrelevante eliminado:

let dead;

setup()
{
    dead = false;
}

draw()
{
    if(fell == true)
    {
        dead = true;
    }
    mechanics();
}

function mechanics()
{

    let triggerVar;

    if(dead == true)
    {   
        triggerVar = 1;

        dead = false;
    }

    if(triggerVar == 1)
    {
        setTimeout(resetG, 1500);
        triggerVar = 0;
    }
}

function resetG()
{
    lives -= 1;
    position = 0;
}

No puedo identificar lo que estoy haciendo mal porque cada vez que el personaje muere y se llama setTimeout, en realidad no solo se llama después del retraso, sino que también se llama durante la misma duración después de que se activa. Entonces, en este caso se activa primero después de 1500 millis y luego en cada frame durante otros 1500 millis.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en la variable triggerVar declarada dentro de la función mechanics(). Esto significa que cada vez que se llama a la función, la variable se restablece a su valor inicial de undefined. Por lo tanto, cuando triggerVar == 1 y se llama a setTimeout(), continuará llamándose en cada fotograma porque triggerVar nunca se restablece a 0.

    Para solucionar este problema, triggerVar debe declararse fuera de la función mechanics() para que su valor persista entre las llamadas a la función. Por ejemplo:

    let dead;
    let triggerVar = 0;
    
    setup() {
        dead = false;
    }
    
    draw() {
        if (fell == true) {
            dead = true;
        }
        mechanics();
    }
    
    function mechanics() {
        if (dead == true) {
            triggerVar = 1;
            dead = false; 
        }
        if (triggerVar == 1) {
            setTimeout(resetG, 1500); 
            triggerVar = 0;
        }
    }
    
    function resetG() {
        lives -= 1;
        position = 0;
    }
    

    Al declarar triggerVar fuera de la función mechanics(), su valor persistirá entre las llamadas y la función setTimeout() solo se llamará una vez después del retraso de 1500 milisegundos.

Comments are closed.