render() { drawRect(0,0,canvas.width,canvas.height,3); console.log(this) // when called with setInterval(classObject.render, 1000), returns window; if called with (classObject).render returns (classObject) for (let i = 0; i <= this.sprites.length; i++) { if (this.sprites[i]) { let cs = this.sprites[i] cs.drawRoutine(cs.position.x,cs.position.y); } } } setRenderInterval(fps) { setInterval(this.render,1000/fps); } Aquí, supongamos que classObject se llama game . Cuando game.render() se llama normalmente, tiene game como this . Pero cuando se llama usando setInterval, tiene una window como this . ¿Cómo puedo evitar esto? this.sprites es una matriz de sprites para el juego, y se debe acceder a ella usando this, ya que puede haber múltiples juegos con diferentes nombres de variables. Y cs.drawRoutine es una función dentro del sprite que simplemente dibuja en el lienzo. La función se ejecuta cuando normalmente se llama.
Como se solicitó (y porque esto será de código abierto más adelante), aquí está toda la clase y lo que la llama:
class gameController extends instance { constructor(name="untitled") { super(name); this.camera = null; this.rendering = {"FPS":0,"cnv":null,"ctx":null} this.sprites = []; this.data.renderFrame = 0; } render() { drawRect(0,0,canvas.width,canvas.height,3); for (let i = 0; i <= this.sprites.length; i++) { if (this.sprites[i]) { let cs = this.sprites[i] cs.drawRoutine(cs.position.x,cs.position.y); } } } setRenderInterval(fps) { return setInterval(this.render,1000/fps); } } const game = new gameController("game"); game.setRenderInterval(30); // called from script/devconsole