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は、HTML5Canvasゲームの詳細を学ぶために私が構築してきた実験的なエンジンです。私がゲームループにぶつかるまで、これまでのところ楽しい時間を過ごしました。runGameは時間の経過とともに呼び出され、Canvasをクリアして、drawScene関数を呼び出します。

LoCEngineインスタンスは変数Engineに保存されます(setTimeoutでそれを使用することがベストプラクティスであるかどうかはわかりません...アドバイスしてください)

最初のフレームに対してthis.drawSceneが正しく呼び出されますが、タイムアウト(30 FPS)時に、次のような例外がスローされます。

TypeError: this.drawScene is not a function

理由はよくわかりません...これは、私が遭遇したことのないJSに関するものだと確信しています。前もって感謝します。

4

1 に答える 1

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()古いブラウザではサポートされていないため、匿名関数を使用する傾向があります。

于 2013-03-14T02:03:08.103 に答える