Я работаю над игрой TBS, использующей шестиугольную сетку. Тем не менее, я хотел, чтобы он был изометрическим (выглядит красивым и пиксельным), а механизм черепицы работает хорошо, это результат:
Однако для этого мне пришлось поиграть со значениями (размер плитки, алгоритм черепицы), чтобы плитки правильно соответствовали.
Вот пример плитки:
Размер плитки составляет 62x32, а при черепичной обработке каждая плитка перемещается на 47 (cw) на 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] на экранное пространство и увидев, находится ли указатель в ней или насколько далеко он, затем медленно прогуливаясь по плитке, пока не найду который содержит координаты мыши (или нет плитки, которая делает), но я ищу более элегантное решение, если оно существует.
Есть ли у кого-нибудь идеи?
Спасибо.