0

ID の 2 次元配列でボックスを表すゲームを作成しています。

var grid =  [[X,X,X,X,X,X,X,X,X,X],
             [X,X,4,4,4,4,X,X,X,X],
             [X,3,3,3,3,X,X,X,X,X],
             [X,X,X,2,2,2,2,X,X,X],
             [X,1,1,1,1,5,5,5,5,5]];

ボックスは互いに積み重なっており、X は空白の場所を表します。

ボックスの 1 つが削除された場合、上のボックス (収まる) のいずれかを下に移動します。そのため、常にきれいに積み上げられています。

したがって、ID: 1 のボックスを削除すると、次のような新しいグリッドが得られます。

var grid =  [[X,X,X,X,X,X,X,X,X,X],
             [X,X,4,4,4,4,X,X,X,X],
             [X,3,3,3,3,X,X,X,X,X],
             [X,X,X,2,2,2,2,X,X,X],
             [X,X,X,X,X,5,5,5,5,5]];

次に、Box: 3 を次のようにその場所にスライドさせます。

var grid =  [[X,X,X,X,X,X,X,X,X,X],
             [X,X,4,4,4,4,X,X,X,X],
             [X,X,X,X,X,X,X,X,X,X],
             [X,X,X,2,2,2,2,X,X,X],
             [X,3,3,3,3,5,5,5,5,5]];

最後に、Box: 4 は 3 があった場所に移動する必要があります。

var grid =  [[X,X,X,X,X,X,X,X,X,X],
             [X,X,X,X,X,X,X,X,X,X],
             [X,X,4,4,4,4,X,X,X,X],
             [X,X,X,2,2,2,2,X,X,X],
             [X,3,3,3,3,5,5,5,5,5]];

これを行う簡単な方法はありますか?ボックスが破壊されたときにグリッドをチェックするコールバックを考えていましたが、思いついたのはほとんど IF ステートメントでした。そこにエレガントなものはありますか?

ボックス クラス自体にも、開始位置とその長さがあります。

  box = {id:     3,
         start:  1,
         length: 4};
4

3 に答える 3

1

遅くなりましたが、いきます。

おそらく行と列を交換する必要があります。それは次のようにします:

var rows = [];
column = [x,x,x,x,x,x,x,x];
rows.push(column);

それ以外の:

var columns = [];
var row = [x,x,x,x,x,x,x,x];
columns.push(row);

このように、ドロップは列に対する単なる配列操作です。spliceその後、ブロック外、ブロック内splice、、、unshiftなどの操作を実行できますshift

アニメーションの前に配列操作を行いますが、グリッドから列と行の情報を取得する前ではありません。

配列メソッドによってそれを行うメソッドに名前を付けることもできます。shift一番下のブロックを落としsplice(start, stop, [optional]new block)ます。そのように。

@Markaiは回答の列と行を入れ替えましたが、明確にするつもりでした。

于 2015-02-06T22:33:26.393 に答える
0

これが私が思いついたものです(機能していませんが要点)

fallCheck = function(deletedPosition, deletedLength) {
  var fallable = grid.reduce(
    function(array, row) {

    var unique = row.filter(function(item, i, ar) { return ar.indexOf(item) === i;});

    var id = unique.find( function(boxId) {
      var box = boxes.iterate("id", boxId, Phaser.Group.RETURN_CHILD);  //Finds the instance within a Phaser Group
      return (box.start >= deletedPosition) && (box.start + box.length) <= (deletedPosition + deletedLength);
    });

    if (id != -1) array.push(id);
  }, []);

  if (fallable.length > 0) { fall(fallable[0]); }  //fall simply moves the box to the lowest position on the grid

};
于 2014-11-15T11:30:03.880 に答える