2013-03-14 49 views
0
LoCEngine.prototype.runGame = function() { 
    // Initiate our game loop 
    ctx.clearRect(0, 0, 800, 600); 
    this.drawScene(this.curScene); 
    if(this.gameRunning) { 
      window.setTimeout(Engine.runGame, 1000/this.framerate); 
    } 
} 

LoCEngine是我一直在構建的一個實驗性引擎,用於瞭解HTML5 Canvas遊戲的來龍去脈。這是一段很美好的時光,直到我玩完遊戲圈。隨時間調用runGame,清除Canvas並調用drawScene函數。setTimeout未找到對象方法

LoCEngine實例存儲在變量引擎(不知道是否使用在setTimeout的是最佳實踐......請指教)

它會正確地調用this.drawScene第一幀,但在超時(30 FPS),它拋出一個異常說:

TypeError: this.drawScene is not a function 

不明白爲什麼......我敢肯定,這只是一些關於JS我還沒有碰到過。先謝謝你。

+0

'this'指的是我相信的窗口對象。你應該使用'LocEngine.framerate' – kennypu 2013-03-14 01:55:13

回答

1

你需要做的是這樣做的正確方法調用:

LoCEngine.prototype.runGame = function() { 
    // Initiate our game loop 
    ctx.clearRect(0, 0, 800, 600); 
    this.drawScene(this.curScene); 
    if(this.gameRunning) { 
      window.setTimeout(function() { 
       Engine.runGame() 
      }, 1000/this.framerate); 
    } 
} 

當你傳遞Engine.runGamesetTimeout(),它只是傳遞的方法引用本身和丟失的對象部分。因此,當它被setTimeout()的內部調用時,它不再具有this中的適當對象引用,並且它在代碼嘗試調用基於this的另一個方法時看到的錯誤。解決方法是像我所示的那樣使用匿名函數自己調用它。

也可以使用.bind(),這在內部基本上爲你做了同樣的事情。但是,舊版瀏覽器不支持.bind(),所以我傾向於使用匿名函數。

+0

謝謝,這似乎已經解決了這個問題。 – 2013-03-14 02:53:34