0

ここで奇妙な動作があります。レンダリングされたJSでは、updateメソッドのthisの値はwindowですが、Gameである必要があります(onKeyDownメソッドの場合と同様)。これをどのように修正しますか?

class Game {

    //for the key events
    rightDown: bool = false;

    constructor() {

    }


    onKeyDown(evt) {
        if (evt.keyCode == 39) this.rightDown = true;
        else if (evt.keyCode == 37) this.leftDown = true;
        if (evt.keyCode == 32) {
            this.space = true;
            var bullet = new GameObjects.GameObjects.Bullet(10);
            this.addProjectile(bullet);
        };
    }



    update(elapsed: number) {

   if (this.rightDown) {
            console.log(this.rightDown);
        }
}
4

1 に答える 1

3

他のどこかであなたはこのようなものを書きました:

setupAnimationTimer(myGame.update); // Maybe window.requestAnimationFrame ?

updatefromのプロトタイプを渡しているだけであることに注意してください。Game実際のインスタンスへのポインタはありません。したがって、コールバックを実行している人が正しいポインタを使用しmyGameてメソッドを正しく呼び出す方法はありません。updatethis

this周りを検索すると、バインディングが失われたり保持されたりする方法についてのブログ投稿がたくさんあります。ここに2つの可能な解決策があります:

// Create a new closure
setupAnimationTimer(() => myGame.update());

また

// Create a new function object that always invokes with the given 'this' value
setupAnimationTimer(myGame.update.bind(myGame));
于 2013-02-25T17:35:35.847 に答える