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;
}

ただし、スイッチ行で「Uncaught TypeError: 未定義のプロパティ '0' を読み取れません」というエラーが表示され、よくわかりません。

編集:エッジは以前にこのように定義されています

edge = Math.sqrt(levelArray.length)
4

5 に答える 5

1

次のように levelArray の配列にアクセスしてみてください。

スイッチ (levelArray[0][i])

、この levelArray[i] は、i=0 の場合には配列を返し、さらに配列を配置した場合は i の他の場合に配列を返すためです!

于 2013-08-13T14:45:44.503 に答える
0

私が見るlevelArray限り、宣言も初期化もされていないため、型がありません。上部の単純なvar levelArray = [];問題を解決する必要があります。

アップデート:

このjsfiddleでコードを試した後、第 2 レベルの配列をループしていないようにも見えます。したがって、変更する必要もありますlevelArray[i][j]

その後、edge定義されていないエラーが発生します。だから、そこにもいくつかの仕事があります。

于 2013-08-13T14:45:03.113 に答える
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

私はあなたがこのようなことをするつもりだったと思います:

多次元配列の代わりに (実際には実行していません)、通常の配列を使用し、すべての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 に答える