0

as3isolib に基づいてアイソメトリック Flash ゲームを拡張しようとしています。このゲームはひし形のグリッドのみをサポートしていますが、長方形のグリッドも実装できるようにする必要があります。私の例の gridを見てください。

私はすでにグリッドを作成することができました。コードは次のとおりです。

private function createRectangularGrid():void
{
    var c:int, r:int;
    var node:DataNode;
    var pt:Pt;
    var nodePos:Point;
    var isEvenRow:Boolean;

    for (c=0; c<cols; c++) {
        nodePos = new Point(c*_cellSize, -c*_cellSize);
        for (r=0; r<rows; r++) {
            node = new DataNode();
            node.col = c;
            node.row = r;
            node.x = nodePos.x;
            node.y = nodePos.y;
            node.z = z;
            node.width = _cellSize;
            node.length = _cellSize;
            node.height = 0;

            pt = new Pt(node.x, node.y, node.z);
            IsoMath.isoToScreen(pt);
            node.screenX = pt.x;
            node.screenY = pt.y;

            _nodes.set(c, r, node);

            isEvenRow = r % 2 == 0;
            if (isEvenRow) nodePos.x += _cellSize;
            else nodePos.y += _cellSize;
        }
    }
}

20pxのセルサイズ (等角の幅と長さ) の場合、上記のグリッド セルの等角位置は次のようになります。

  • [データノード (列:0, 行:0, x:0, y:0)]
  • [データノード (列:0, 行:1, x:20, y:0)]
  • [データノード (列:0, 行:2, x:20, y:20)]
  • [データノード (列:0, 行:3, x:40, y:20)]
  • [データノード (列:0, 行:4, x:40, y:40)]
  • [データノード (列:0, 行:5, x:60, y:40)]
  • [データノード (列:0, 行:6, x:60, y:60)]
  • [データノード (列:1, 行:0, x:20, y:-20)]
  • [データノード (列:1, 行:0, x:20, y:-20)]
  • [データノード (列:1, 行:1, x:40, y:-20)]
  • [データノード (列:1, 行:2, x:40, y:0)]
  • [データノード (列:1, 行:3, x:60, y:0)]
  • [データノード (列:1, 行:4, x:60, y:20)]
  • [データノード (列:1, 行:5, x:80, y:20)]
  • [データノード (列:1, 行:6, x:80, y:40)]
  • [データノード (列:2, 行:0, x:40, y:-40)]
  • [データノード (列:2、行:1、x:60、y:-40)]
  • [データノード (列:2, 行:2, x:60, y:-20)]
  • [データノード (列:2、行:3、x:80、y:-20)]
  • [データノード (列:2、行:4、x:80、y:0)]
  • [データノード (列:2、行:5、x:100、y:0)]
  • [データノード (列:2, 行:6, x:100, y:20)]

問題は、グリッドが菱形のようにすべてのオブジェクトとアバターがまだ配置されていることです。これは、等角の x/y 位置に基づいて列と行の番号を計算する式がダイヤモンド グリッドに対してのみ機能するためです。

var isoPt:Pt = IsoMath.screenToIso(new Pt(avatar.x, avatar.y));
var col:uint = Math.floor(isoPt.x / CELLSIZE);
var row:uint = Math.floor(isoPt.y / CELLSIZE);

長方形のグリッドの式がどうあるべきか知っている人はいますか?

4

1 に答える 1

0

私はそれを考え出した。次のメソッドは、パラメーターとして渡されたアイソメトリック x/y 位置の下にあるタイルの列と行の番号を返します。

public function getNodeByIsoPos(x:Number, y:Number):DataNode
{
    var c:uint, r:uint;
    if (_shape == STAGGERED_SHAPE) {
        // This calculates column and row for a rectangular map (also called staggered map or block map)
        c = Math.floor((Math.floor(x / _cellSize) - Math.floor(y / _cellSize)) / 2);
        r = Math.floor(x / _cellSize) + Math.floor(y / _cellSize);
    } else {
        // This calculates column and row for a diamond map
        c = Math.floor(x / _cellSize);
        r = Math.floor(y / _cellSize);
    }
    return getNode(c, r);
}

完璧に動作します。もっとエレガントな方法があれば教えてください。

于 2011-07-03T14:08:16.187 に答える