No puedo entender por qué se llama a setTimeout 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 decir qué estoy haciendo mal porque cada vez que el personaje muere y se llama a setTimeout, en realidad no solo se llama después del retraso sino también por exactamente la misma duración después de que se activa. Entonces, en este caso, se activa primero después de 1500 milisegundos y luego cada fotograma durante otros 1500 milisegundos.
Logré encontrar el problema, que no estaba en el código que publiqué. El problema era que el código del constructor que hace que el objeto que cambia muerto se convierta en verdadero si se cumplen ciertas condiciones se llamaba en cada cuadro desde el momento en que provocó la muerte hasta que se activó la primera instancia de setTimeout, lo que significa que se llamó a setTimeout en cada cuadro durante 1500 milisegundos.
Lo más probable es que su función mechanics() se llame varias veces, puede dar una variable al settimeout como:
let timeoutID= setTimeout(resetG, 1500);
Y en el lugar adecuado para limpiarlo, por ejemplo, después del ciclo de vida
clearTimeout(timeoutID);