2016-12-18 5 views
-1

蜂は楽しいゲームを作り始めます。問題は、ゲームオブジェクトに新しいプレーヤーを作るときに、更新関数では定義されていないが、作成関数で定義されているということです。ここでプレイヤーは更新時に定義されていませんが、作成時には定義されていません

Game.prototype = { 
    create: function() {  
     this.player = new Player(this.ctx, this.canvas); 
     this.player.create(); 
     console.log(this.player); // shows the player in console 
    }, 
    update: function() { 
     console.log(this.player); //undefined 
     this.player.update(); 
    } 
}; 

私は

function startGame(){ 
    var fps = 1; 
    var game = new Game(); 
    game.create(); 
    setInterval(game.update, 1000/fps); 
} 

エラー - >キャッチされない例外TypeError私のゲームを起動する方法です:あなたは

+1

多分、 'setInterval(function(){game.update()}、1000/fps)' – CollinD

+0

を試してみてください。 – iWillBeMaster

答えて

0

に:更新時に未定義 のプロパティ 'update' を読み込むことができません(19 Game.js)いくつかのコードを残してしまったのですが(Gameは定義されていないので、あなたのエラーは間違いです)、あなたの解決策はおそらくsetIntervalコールを変更することになります

を使用する方法を引き起こすややわかりにくい副作用を持っている210
setInterval(function() { game.update() }, 1000/fps); 

が正しくupdate以来thisgameにバインドされていない関連付けられずに呼ばれるように(カイル林の回答を参照してください)。基本的にupdateはすべて単独で存在し、参照を直接作成すると、game.updateで参照したという事実は失われます。

このような無名関数を使用すると、updateは、呼び出されたときに適切な/期待されるthisの値を持ちます。これは、明示的な構文を使用できるからです。[OBJECT].[MemberMethod]()は、暗黙的にthis[OBJECT]にバインドします。

0

setIntervalコールバックのコンテキストでは、thisは、通常、ウィンドウを参照します。それは.bind()方法使用して、その意図する目標(ゲームのインスタンス)を指していることを確認してください:.bind()方法の詳細については

function startGame(){ 
    var fps = 1; 
    var game = new Game(); 
    game.create(); 
    setInterval(game.update.bind(game), 1000/fps); 
} 

を、こちらをクリックしてください: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

EDIT:上 はさらに良いリンクをウィンドウタイマthis問題: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval#The_this_problem、Andrew Liのおかげです。

+1

追加する便利なリンク:https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval#The_this_problemとhttps://developer.mozilla.org/en-US/docs/Web/ API/WindowTimers/setTimeout#The_this_problem – Li357

関連する問題