2017-05-08 11 views
0

残念ながら、主なゲームのアップデートループが11回以上実行された後にバグが発生するため、reduce codeのサンプルを提供することはできませんが、プロジェクトが簡単であることを願っています。この不可能なバグを見つけ出す方法は?

これは、プロジェクトへのリンクです: https://github.com/marko-avlijas/udacity-frogger

プロジェクトはudacityゲームのプロジェクトであり、それは3つのファイルが付属していますが、私はバグがなければならない場合にのみapp.jsようだ修正しました。

問題はengine.jsで始まり、機能はUpdateEntitiesで変更されていません。

Enemy.prototype.update = function(dt) { 
    // this is the line which is causing error 
    this.area.updateOuterLeft(this.area.outer.left + dt*this.speed); 
    if (this.area.outer.left > settings.canvas.width) 
     this.area.updateOuterLeft = -settings.canvas.width*2.5; 
}; 

どういうわけか、これは罰金最初の11作品:その後、app.jsでこれを呼び出す

function updateEntities(dt) { 
    allEnemies.forEach(function(enemy) { 
     // this is the line which calls problem function 
     enemy.update(dt); 
    }); 
    player.update(); 
} 

updateEntities()が実行されますが、その後、私はこのエラーを取得し、このエラーに

を取得された回数:

Uncaught TypeError: this.area.updateOuterLeft is not a function 
at Enemy.update (file:///data/komp_tuts/udacity/oo_js/frontend-nanodegree-arcade-game-master/js/app.js:123:15) 
at file:///data/komp_tuts/udacity/oo_js/frontend-nanodegree-arcade-game-master/js/engine.js:100:19 
at Array.forEach (native) 
at updateEntities (file:///data/komp_tuts/udacity/oo_js/frontend-nanodegree-arcade-game-master/js/engine.js:99:20) 
at update (file:///data/komp_tuts/udacity/oo_js/frontend-nanodegree-arcade-game-master/js/engine.js:83:9) 
at main (file:///data/komp_tuts/udacity/oo_js/frontend-nanodegree-arcade-game-master/js/engine.js:49:9) 

debugggerでは、私はそれがされている必要がありますようにthiswindow、ないenemyに設定されていることがわかります。 windowにはareaが定義されていないため、このエラーが発生します。

私はこれを理解できません。助けてください。

これをデバッグするヒントも歓迎します。

エラーが発生した場合、updateEntities()が何回呼び出されたかを確認するカウンタを設定しています。しかし、if文をconsole.logに11回置くと、エラーは13回発生します。私が13回目に停止すると、エラーはなく、少し後に起こります。

答えて

1

問題は今.updateOuterLeftは、機能ではなく、値を、フローティングになって、あなたが

this.area.updateOuterLeft = -settings.canvas.width*2.5;で、既存の機能を置き換える.update機能、です。

Enemy.prototype.update = function(dt) { 
    // this is the line which is causing error 
    this.area.updateOuterLeft(this.area.outer.left + dt*this.speed); 
    if (this.area.outer.left > settings.canvas.width) 
     this.area.updateOuterLeft = -settings.canvas.width*2.5;//<==== 
}; 
+1

どのように素早く把握できましたか?ちょうどコードまたはいくつかの高度なクロムデバッガカンフーを見て? –

+1

あなたのコードでは、あなたはすでに '.updateOuterLeft'関数を呼び出していましたが、いつか壊れてしまいました 2)これは誰かを意味します.updateOuterLeft'が変更されています。 3) 'this.area.updateOuterLeftは関数ではありません'というエラー自体です。 4)次に、どのラインが原因であるかを調べる – JagsSparrow

関連する問題