我正在尝试扩展基于as3isolib的等距Flash游戏。游戏只支持菱形网格,但我必须实现矩形网格的可能性。请参阅我的example 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 的单元格(等距宽度和长度),上面显示的网格单元格的等距位置为:
问题在于所有物体和化身仍然像网格是菱形一样放置。这是因为基于等距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);
有人知道矩形网格的公式应该如何吗?
答案 0 :(得分:0)
我明白了。以下方法将返回位于作为参数传递的等轴x / y位置下的tile的列号和行号。
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);
}
完美无缺。如果有更优雅的方式,请告诉我。