0

どの座標が「占有」されているかを格納するために使用される座標の配列に変換するオブジェクトがあります。

私はそれが機能していると思ったが、console.logを介してさらに調べたところ、アレイにはかなりの数の結果がありません。

つまり、これは基本的に私のオブジェクトです。

var sdata = {"4":{"7":["1","7","3","3"]}};

つまり、これは次のとおりです。

var sdata = {"X":{"Y":["ID","ID","Width","Height"]}

これらは無関係であるため、このIDは無視してください...しかし、このデータを使用して、タイルの寸法の幅と高さに関連するXとY+追加のXとYの座標を取得しようとしています。

4:7のオブジェクトが3 x 3次元であるとすると、これらの9つのグリッド参照が存在することになります。

[4:7], [5:7], [6,7]  
[4:8], [5:8], [6,8]  
[4:9], [5:9], [6:9]

したがって、座標を作成する私の関数は次のとおりです。

function populate_collisions() {

  for (var X in sdata) {
    X = parseInt(X);

    for (var Y in sdata[X]) {
      Y = parseInt(Y);
      width = parseInt(sdata[X][Y][2]);
      height = parseInt(sdata[X][Y][3]);

  for (i=X; i!= X+width; i++) {

        if( typeof gcollision[i] == 'undefined' ) {
          gcollision[i] = new Array();
        }
        gcollision[i][Y] = 1

        for (j=Y; j!=Y+height; j++) {

          if( typeof gcollision[X] == 'undefined' ){ 
            gcollision[X] = new Array();
          }
          gcollision[X][j] = 1
        }
      }
    }
  }
}

しかし、私の配列に対してこの結果を取得しているため、私のロジックは間違っている必要があります。

[4] [7] = 1
[4] [8] = 1
[4] [9] = 1
[5] [7] = 1
[6] [7] = 1

追加のデータが欠落している理由はありますか?

4

2 に答える 2

1

修正されたコードは次のとおりです。

function populate_collisions() {

  for (var X in sdata) {
    X = parseInt(X);

    for (var Y in sdata[X]) {
      Y = parseInt(Y);
      var width = parseInt(sdata[X][Y][2]);
      var height = parseInt(sdata[X][Y][3]);

      for (var i=X; i < X+width; i++) {

        if (!gcollision[i]) {
          gcollision[i] = [];
        }
        gcollision[i][Y] = 1;

        for (var j=Y; j < Y+height; j++) {

次のパートでは、を使用していましXた。これは常に4であるため、その配列を上書きするだけでした。iの代わりに使用してくださいX

gcollision[X][j]配列は上で作成されているため、本当に意味があるか類似していない限り、ifテストは必要ありません。gcollisionオブジェクトに必要な構造がわからないため、わかりません。

/*
          if (!gcollision[i][j]) { 
            gcollision[i][j] = [];
          }
*/          
          gcollision[i][j] = 1;
        }
      }
    }
  }
}

レコードの場合、結果のオブジェクト(他のプロパティがないと仮定gcollision)は次のとおりです。

alert(JSON.stringify(gcollision));
/*
{"4":[null,null,null,null,null,null,null,1,1,1],
 "5":[null,null,null,null,null,null,null,1,1,1],
 "6":[null,null,null,null,null,null,null,1,1,1]}
*/

これらのnullはすべて存在するわけではなく、配列はスパースですが、JSONがそれらを表す方法です。

于 2012-04-07T03:04:23.653 に答える
1

私は希望する出力を完全には理解していないことを認めなければなりませんが、これはあなたが望むもののようです。

var sdata = {"4":{"7":["1","7","3","3"]}},
    result = [],
    x_arr;
for (var X in sdata) {
    for (var Y in sdata[X]) {
        for (var i = 0; i < sdata[X][Y][2]; i++) {
            x_arr = [];
            result.push(x_arr);
            for (var j = 0; j < sdata[X][Y][3]; j++) {
                x_arr.push((+X + j) + ':' + (+Y + i))
            }
        }
    }
}

配列メンバーごとに文字列連結を使用しました。が何を意味するのか正確にはわかりませんでした[4:7]

結果は...

[["4:7", "5:7", "6:7"], 
 ["4:8", "5:8", "6:8"], 
 ["4:9", "5:9", "6:9"]]

http://jsfiddle.net/mPM96/


おそらくあなたはこれを意図していました。

var sdata = {"4": {"7": ["1", "7", "3", "3"]}},
    result = [];
for (var X in sdata) {
    for (var Y in sdata[X]) {
        for (var i = 0; i < sdata[X][Y][2]; i++) {
            result[+X + i] = [];
            for (var j = 0; j < sdata[X][Y][3]; j++) {
                result[+X + i][+Y + j] = 1;
            }
        }
    }
}
于 2012-04-07T02:41:40.163 に答える