0

我正在尝试使用此代码显示我将拥有的级别...

levelArray[0] = ["player", "empty", "empty", "empty", "wall", "wall", "empty",
    "empty", "wall", "wall", "empty", "empty", "empty","empty",
    "empty", "empty", "empty", "wall", "empty", "wall", "wall",
    "wall", "wall", "empty", "wall", "empty", "wall", "empty",
    "box", "wall", "empty", "wall", "empty", "empty", "empty",
    "empty", "empty", "empty", "wall", "wall", "wall", "empty",
    "wall", "wall", "empty", "empty", "ghost", "wall","ghost"];

for(var i = 0; i < edge; i++)
{
    for(var j = 0; j < edge; j++)
    {
        switch(levelArray[i])
        {
            case "empty":   // empty location
                ctx.drawImage(emptyTile, currentX, currentY);
                break;
            case "wall":    // wall block
                ctx.drawImage(wallTile, currentX, currentY);
                break;
            case "box":     // box block
                ctx.drawImage(boxTile, currentX, currentY);
                break;
            case "ghost":   // enemy sprite
                ctx.drawImage(ghostTile, currentX, currentY);
                break;
            case "player":  // player sprite
                ctx.drawImage(playerTile, currentX, currentY);
                break;
        }
        currentX += elementEdge;
    }
    currentY += elementEdge;
}

但是我在切换行“未捕获的类型错误:无法读取未定义的属性 '0'”上收到错误,我真的不明白。

编辑:edge 以前是这样定义的

edge = Math.sqrt(levelArray.length)
4

5 回答 5

1

您没有使用内部循环。我相信你想要这个:

switch(levelArray[i][j])

您的源代码中,该片段位于setupCanvas函数内部,并带有levelArray作为参数。由于您在调用时没有传递任何内容setupCanvas,因此将其视为undefined. 因此你得到的错误。

于 2013-08-13T14:44:17.683 回答
1

尝试像这样访问您的 levelArray 数组:

开关(levelArray[0][i])

, 因为这个 levelArray[i] 将在 i=0 的情况下返回数组,如果你放置了更多的数组,则返回 i 的其他情况!

于 2013-08-13T14:45:44.503 回答
0

我认为你打算做这样的事情:

我使用常规数组而不是多维数组(您实际上并没有这样做),并且每edge一步,我都会重置 currentX 参数并增加 currentY 参数

var edge = 7, elementEdge=20;
var levelArray = ["player", "empty", "empty", "empty", "wall", "wall", "empty",
    "empty", "wall", "wall", "empty", "empty", "empty","empty",
    "empty", "empty", "empty", "wall", "empty", "wall", "wall",
    "wall", "wall", "empty", "wall", "empty", "wall", "empty",
    "box", "wall", "empty", "wall", "empty", "empty", "empty",
    "empty", "empty", "empty", "wall", "wall", "wall", "empty",
    "wall", "wall", "empty", "empty", "ghost", "wall","ghost"];

var currentX = 0, currentY = 0;
for (var i = 0; i < levelArray.length; i++) {
  switch (levelArray[i]) {
    // All your cases here...
  }
  currentX += elementEdge;
  if (i % edge == 0) {
    currentX = 0;
    currentY += elementEdge;
  }
}

另一个答案可能是真正使用多维数组:

var levelArray = [["player", "empty", "empty", "empty", "wall", "wall", "empty"],
    ["empty", "wall", "wall", "empty", "empty", "empty","empty"],
    ["empty", "empty", "empty", "wall", "empty", "wall", "wall"],
    ["wall", "wall", "empty", "wall", "empty", "wall", "empty"],
    ["box", "wall", "empty", "wall", "empty", "empty", "empty"],
    ["empty", "empty", "empty", "wall", "wall", "wall", "empty"],
    ["wall", "wall", "empty", "empty", "ghost", "wall","ghost"]];

for(var i = 0; i < levelArray.length; i++)
{
    for(var j = 0; j < levelArray[i].length; j++)
    {
        switch(levelArray[i][j])
        {
            case "empty":   // empty location
                ctx.drawImage(emptyTile, currentX, currentY);
                break;
            case "wall":    // wall block
                ctx.drawImage(wallTile, currentX, currentY);
                break;
            case "box":     // box block
                ctx.drawImage(boxTile, currentX, currentY);
                break;
            case "ghost":   // enemy sprite
                ctx.drawImage(ghostTile, currentX, currentY);
                break;
            case "player":  // player sprite
                ctx.drawImage(playerTile, currentX, currentY);
                break;
        }
        currentX += elementEdge;
    }
    currentY += elementEdge;
  }
}
于 2013-08-13T14:54:20.317 回答
0

我认为您需要一个多级数组(二维)

levelArray = [
    ["player", "empty", "empty", "empty", "wall", "wall", "empty"],
    ["empty", "wall", "wall", "empty", "empty", "empty","empty"],
    ["empty", "empty", "empty", "wall", "empty", "wall", "wall"],
    ["wall", "wall", "empty", "wall", "empty", "wall", "empty"],
    ["box", "wall", "empty", "wall", "empty", "empty", "empty"],
    ["empty", "empty", "empty", "wall", "wall", "wall", "empty"],
    ["wall", "wall", "empty", "empty", "ghost", "wall","ghost"]
];

现在你可以像这样迭代它

var elemWidth = 20, elemHeight = 20;
for (var i=0; i<levelArray.length; i++) {
    for (var j=0; j<levelArray[i].length; j++) {
        switch(levelArray[i][j]) {
            case "empty": ctx.drawImage(emptyTile, i*elemWidth, j*elemHeight); break;
            case "wall": ctx.drawImage(wallTile, i*elemWidth, j*elemHeight); break;
            case "box": ctx.drawImage(boxTile, i*elemWidth, j*elemHeight); break;
            case "ghost": ctx.drawImage(ghostTile, i*elemWidth, j*elemHeight); break;
            case "player": ctx.drawImage(playerTile, i*elemWidth, j*elemHeight); break;
        }
    }
}
于 2013-08-13T15:00:10.953 回答
0

据我所知,levelArray没有声明或初始化,所以它没有类型。var levelArray = [];顶部的简单应该可以解决您的问题。

更新:

在此jsfiddle中尝试您的代码后,看起来您并没有循环遍历二级数组。所以你还需要改变levelArray[i][j]

之后,我收到一个edge未定义的错误。所以你在那里也有一些工作。

于 2013-08-13T14:45:03.113 回答