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);
長方形のグリッドの式がどうあるべきか知っている人はいますか?