Я пытаюсь расширить изометрическую флеш игру на основе as3isolib.Игра поддерживает только сетки в форме ромба, но я также должен реализовать возможность иметь сетки прямоугольной формы.Посмотрите мой пример сетки .
Мне уже удалось создать сетку.Вот код:
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 изометрические положения ячеек сетки, показанные выше:
- [DataNode (столбец: 0, строка: 0, x: 0, y: 0)]
- [DataNode (столбец: 0, строка: 1, x: 20, y: 0)]
- [DataNode (столбец: 0, строка: 2, x: 20, y: 20)]
- [DataNode (столбец: 0, строка: 3, x: 40, y: 20)]
- [DataNode (столбец: 0, строка: 4, x: 40, y: 40)]
- [DataNode (столбец: 0, строка: 5, x: 60, y: 40))]
- [DataNode (столбец: 0, строка: 6, x: 60, y: 60)]
- [DataNode (столбец: 1, строка: 0, x: 20, y): -20)]
- [DataNode (столбец: 1, строка: 0, x: 20, y: -20)]
- [DataNode (столбец: 1, строка: 1, x): 40, y: -20)]
- [DataNode (столбец: 1, строка: 2, x: 40, y: 0)]
- [DataNode (столбец: 1, строка:3, x: 60, y: 0)]
- [DataNode (столбец: 1, строка: 4, x: 60, y: 20)]
- [DataNode (столбец: 1,строка: 5, x: 80, y: 20)]
- [DataNode (столбец: 1, строка: 6, x: 80, y: 40)]
- [DataNode (столбец:2, строка: 0, x: 40, y: -40)]
- [DataNode (столбец: 2, row: 1, x: 60, y: -40)]
- [DataNode (столбец: 2, строка: 2, x: 60, y: -20)]
- [DataNode (столбец: 2, строка: 3, x: 80, y: -20)]
- [DataNode (столбец: 2, строка: 4, x: 80, y: 0)]
- [DataNode (столбец: 2, строка: 5, x: 100, y: 0)]
- [DataNode (столбец: 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);
Кто-нибудь знает, как должна быть формула для сетки прямоугольной формы?