2017-11-18 17 views
0

で定義されていると言う(EDIT:!私はまだ私は、デバッガで見る状況を理解していないけど、私は私の問題を解決し、より詳細については、私の答えを参照してください。)未定義のインデックス...しかし、それはそれは、デバッガ

(TL; DR:特定の配列で使用すると、インデックスは常に未定義ですが、これは十分な情報になりますが、これまで経験したことのある人にとってはおそらく疑いがあります)

これは基本的にjavascriptで配列を使用しています。私はいくつかの奇妙な動作に気付き始めたので、私はデバッガに行きました、そして、私は、インデックスを表す定義された変数が未定義として扱われていたことがわかりました。これは、この特定の配列とそのインデックスの場合のみです。私はそれが未定義であるというエラーは出ませんが、デバッガを見ると、配列呼び出しの変数にカーソルを置くと定義されていません(配列呼び出しの前のどこにでも置かれていると定義されています)。配列が適切に使用されていないことを明らかにするバグがあります。それは私には絶対に意味がありませんが、誰かが同様の問題に遭遇した可能性があります。

このコード例では、MapRendererクラスのタイルマップレイヤを描画しています。ここでの犯人は「this.Map.layers」です。デバッガでこの関数を実行すると、functionパラメータにカーソルを置くとlayerIndexが定義されますが、配列呼び出しでその上にマウスカーソルを置くと、定義されていないと判断され、ロジック全体がブレークします。

DrawLayer(ctx, camPos, layerIndex) 
{ 
    // Get the map/tile position based on the camera position, to decide which tile to start drawing. 
    var mapCamPos = new Point(Math.floor(camPos.x/TILESIZE), 
           Math.floor(camPos.y/TILESIZE)); 
    // Get the max tile position based on camera position, to decide where to stop drawing. 
    var camPosLimit = new Point(Math.ceil(this.DrawSize.x/TILESIZE)+mapCamPos.x, 
           Math.ceil(this.DrawSize.y/TILESIZE)+mapCamPos.y); 

    // loop through all tiles we need to draw using rows and columns. 
    for(var row=mapCamPos.y;row<this.Map.layers[layerIndex].height&&row<=camPosLimit.y;row++) 
    { 
     for(var col=mapCamPos.x;col<this.Map.layers[layerIndex].width&&col<=camPosLimit.x;col++) 
     { 
      var currentTileID = this.GetTileID(layerIndex, row, col); 
      if (currentTileID >= 0 && !isNaN(currentTileID)) 
      { 
       var drawPos = new Point(((col*TILESIZE)-camPos.x), ((row*TILESIZE)-camPos.y)); 
       this.Spritesheet.PlayFrame(currentTileID); 
       this.Spritesheet.Draw(ctx, drawPos); 
      } 
     } 
    } 
} 

私のコードの多くのインスタンスで、この配列を使用しているところでは、これが起こっています。私はこの論理が以前に働いていたので、これがどのように始まったのかを追加したい。私は複数のcsvファイルを扱うタイルマップを用意していました.2次元配列として配列にロードしました。今日は、1つのjsonファイルを使用するように切り替えることにしました。マップレイヤーごとに1つのCSVファイルではなく1つのファイルであるため、タイルIDを持つだけでなく、将来的に追加のプロパティやものを追加できます。したがって、上記の例では、DrawLayerが呼び出される前にjsonファイルを読み込むために、ajax呼び出し(jqueryを使用)によってthis.Mapが初期化されます。それでも、なぜこれが起こるのか分かりません。コンソールで "mapRenderer.Map.layers"を実行すると、それは通常の配列であることがわかります。通常はコンソールから呼び出すと、正常に動作します。私はこの問題でとても混乱しています。以前は文字通り同じ機能を持っていましたが、配列がちょっと変わっただけです(以前は "this.Map.layers"の代わりに "this.Layers"でした)が、まだ普通の配列です。なぜ私はそれがjsonによって生成されたのかとは違った振る舞いをしているのではないでしょうか...。

何か助けや説明をいただければ幸いです。

+0

2番目の 'layerIndex'の上にマウスを置くと、' this.Map.layers [layerIndex] 'の上にホバリングしているとは思わないでしょうか? –

+0

これはどのブラウザですか? –

+1

このajaxコールは非同期ですか?もしそうなら、 'DrawLayer'関数はどこから呼び出されますか? ajax呼び出しの後、またはその成功ハンドラの内部?もしそれが後であれば、私はアヤックスコールの結果がまだ到着していないと期待しているので、「これはマップレイヤー」にまだデータが入っていないからです。 –

答えて

0

私はまだデバッガに表示されている状況を理解していない、おそらくFirefoxのバグ、または私が理解できない機能です。しかし私は私の問題を解決することができた。それは基本的なロジックのバグでした:私は "タイル"マップエディタを使用しています、そしてそれらのマップをCSVにエクスポートするとき、タイルIDはゼロベースです。つまり空のタイルは-1です。 jsonにエクスポートするとき、それらはゼロベースではありません。空のタイルは0であり、これは私が気づいていないことを意味し、これは私の現在のすべての問題の根源でした。 Firefoxのデバッガが、定義された変数が "未定義"であると言っている理由を誰かが説明できるのであれば、それはまだ知っておくと良いでしょう。

関連する問題