2017-12-27 60 views
0

練習として、私はthis tutorialを行ってから、すべてを独自のクラスに入れてクリーンアップするバージョンを作成しようとしました。問題は、私には意味をなさないと思われるエラーが発生していることです。 (すべてのコメントのものは私の最後に記入されていますが、それは問題に関連していないようでした)私はクラスからlastRender変数を削除するとUncaught TypeError: Cannot read property 'lastRender' of null at loop (game-loop.js:13)ヌルのプロパティ____を読むことができません

class GameLoop { 
    constructor(player, canvas) { 
    // Set other variables 
    this.lastRender = 0; 
    window.requestAnimationFrame(this.loop); 
    } 

    loop(timestamp) { 
    let progress = timestamp - this.lastRender; // This is ln. 13 in the actual program 

    this.update(progress); 
    this.draw(); 

    this.lastRender = timestamp; 
    window.requestAnimationFrame(this.loop); 
    } 

    update(progress) { 
    // Update function 
    } 

    draw() { 
    // Draw function 
    } 

} 

さらに、それは私にそのエラーを与えて停止しますが、代わりにUncaught TypeError: Cannot read property 'update' of null at loop (game-loop.js:15)

+0

'GameLoop'クラスに対して' lastRender'が定義されていません。それが定義されていることを確認してください。 –

+0

@Abdullah Khanあなたが何を意味するのかわかりません –

+0

'GameLoop'クラスの' lastRender'とは何ですか? 'this.lastRender'と言うと、オブジェクトプロパティ' lastRender'を参照します。 –

答えて

1

thisに正しい値を設定するには.bind()を使用する必要があります。これに

window.requestAnimationFrame(this.loop); 

:この変更あなたがthis.loopでやっているようあなたがコールバックとしてメソッドを渡すと

window.requestAnimationFrame(this.loop.bind(this)); 

を、thisの値は、メソッドへの参照のみが渡されていません。したがって、window.requestAnimationFrame()loop()を呼び出すと、を使用しようとすると表示されるエラーが表示され、thisがメソッド内で正しい値を持つように呼び出されません。

+0

私はこれを既に試しましたが、何も変えていないように見えました。 –

+0

また、bindとnotを使用する違いは何ですか? –

+0

@ZacharyElkins - コールバックとしてメソッドを渡すすべての場所(少なくとも2つの場所に 'window.requestAnimationFrame()'を表示する必要があります)私の答えにはもっと詳しい説明があります – jfriend00

関連する問題