Преобразование координат экрана в карту в изометрическом шестиугольном двигателе? - PullRequest
11 голосов
/ 07 июля 2011

Я работаю над игрой TBS, которая использует гексагональную сетку.Тем не менее, я хотел, чтобы он был изометрическим (выглядит красиво и пиксельно), и механизм листов работает хорошо, вот результат:

Однако, чтобы добиться этого, мне пришлось возиться со значениями(размер тайла, алгоритм тайлинга) для правильного размещения тайлов.Вот пример плитки:

Размер плитки составляет 62x32, а при укладке плитки каждая плитка перемещается на 47 (по часовой стрелке) на x и на 16 (ch) на y для правильного размещения.

Вот как я вычисляю корнинаты экрана (для рисования тайлов) по координатам карты:

function toScreen(x, y, z, offset)
{
    offset = ifndef(offset, {x: 0, y: 0});
    var ret = new Vector2D(y*Tile.cw + x*Tile.cw -offset.x, -x*Tile.ch + y*Tile.ch -offset.y -z*16);
    ret.y += (Tile.height*this.h)/2; //center the map on screen
    return ret;
}

Теперь мне нужно иметь возможность выбирать тайлы и получать координаты карты по координатам экрана (мыши).Я не могу понять, возможно ли вообще как-то преобразовать координаты (все мои попытки провалились).

Вот как выглядит система координат карты и как рисуются плитки:

Выбор плиток, конечно, должен быть идеальным по пикселям, но только для плоских плиток(не нужно выбирать деревья, которые идут над плиткой выше), поэтому алгоритм может предположить, что все плитки плоские (как тот, который я привел в качестве примера).У кого-нибудь есть идеи как это сделать?Я мог бы «перебить» его, преобразовав плитку в [0,0] в пространство экрана и, увидев, находится ли в ней указатель или как далеко, затем медленно пройтись по плитке, пока не найдуплитка, которая содержит координаты мыши (или нет плитки, которая имеет), но я ищу более элегантное решение, если оно существует.

У кого-нибудь есть идеи?

Спасибо.

1 Ответ

7 голосов
/ 07 июля 2011

Взгляните на эту статью для более подробной обработки гексагональных сеток: http://playtechs.blogspot.com/2007/04/hex-grids.html

Есть раздел о том, как преобразовать прямоугольные координаты в шестиугольные.Вы можете легко адаптировать его метод к вашей "изометричной мозаике шестиугольника", добавив дополнительное аффинное преобразование, превращающее ваши шестиугольники в обычные шестиугольники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...