Вычисление номера столбца и строки в изометрической прямоугольной сетке - PullRequest
0 голосов
/ 01 июля 2011

Я пытаюсь расширить изометрическую флеш игру на основе 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);

Кто-нибудь знает, как должна быть формула для сетки прямоугольной формы?

1 Ответ

0 голосов
/ 03 июля 2011

Я понял это. Следующий метод вернет номер столбца и строки плитки, лежащей под изометрической позицией 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);
}

Работает отлично. Пожалуйста, дайте мне знать, если есть более элегантный способ.

...