(编辑:我解决了我的问题!虽然我仍然不了解我在调试器中看到的情况。请参阅我的回答了解更多详情)
(TL; DR:当与某个阵列一起使用时,索引总是未定义。怀疑这是足够的信息,但也许对于之前经历过这种情况的人来说。)
基本上,我在javascript中使用数组,并且我开始注意到一些奇怪的行为,所以我去了调试器,我发现表示索引的已定义变量被视为未定义。这只是这个特定数组及其索引的情况。我没有错误地说它未定义,但是当我查看调试器时,它表示当我将鼠标悬停在数组调用中的变量上时它是未定义的(但是它是' s如果我在数组调用之前将其悬停在任何位置,则定义,并且我得到的错误表明数组没有正确使用。这对我来说完全没有意义,但也许有人遇到过类似的问题。
以这个代码为例,它为我的MapRenderer类绘制了一个tilemap图层。这里的罪魁祸首是#34; this.Map.layers"。当我在调试器中进入此函数时,如果我将鼠标悬停在函数参数上,则会定义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);
}
}
}
}
在我的代码的许多实例中都会发生这种情况,无论我在哪里使用该数组。我想补充一下这是如何开始的,因为所有这些逻辑都在以前工作。我让我的tilemap使用多个csv文件,我将其作为2d数组加载到一个数组中。今天,我决定将它全部切换为使用一个json文件,因为它更简洁(每个地图层只有一个文件而不是一个csv),并且我可以在将来添加额外的属性和内容,而不仅仅是使用tileID。因此,在上面的例子中,在调用DrawLayer之前,this.Map通过ajax调用(使用jquery)初始化来读取json文件。不过,我不知道为什么会导致这种情况。做&#34; mapRenderer.Map.layers&#34;在控制台中告诉我它是一个正常的数组,当我尝试从控制台正常调用它时,它工作正常。我对这个问题很困惑。我之前确实有相同的功能并且它有效,只是我的数组已经改变了一点(过去只是#34; this.Layers&#34;,而不是&#34; this.Map.layers&#34; ),但它仍然是一个正常的阵列......我不明白为什么它会因为它是通过json生成而表现得如此不同...
非常感谢任何帮助或解释,谢谢。
答案 0 :(得分:0)
我仍然不了解我在调试器中看到的情况,可能是火狐漏洞,或者我不理解的功能。但我设法解决了我的问题。这是一个基本的逻辑错误:我正在使用&#34; Tiled&#34;地图编辑器,当您将这些地图导出为CSV时,切片ID从零开始,这意味着空切片为-1。当你导出到json时,它们不是从零开始的,这意味着空的tile是0,我没注意到,这是我当前所有问题的根源。如果有人能解释为什么firefox调试器可能会说定义的变量是&#34; undefined&#34;当你将鼠标悬停在它们上面时,这仍然是个好消息。