Изометрическая проекция с использованием библиотеки as3isolib

Что такое изометрия, простым, человеческим языком, — это псевдо трехмерная проекция, при которой все объекты повернуты к нам под углом в 45 градусов, так, что мы видим три стороны фигуры. При этом масштаб фигур не изменяется в зависимости от их удаленности. Доступных к общему пользованию изометрических движков на AS3 на самом деле не так уж и много, можно пересчитать на пальцах и двух рук хватит. Расскажу про один из них — as3Isolib.

Библиотека с открытым исходным кодом. Легко допиливается под свои нужды. Глюков особо замечено не было. Скоростью, правда, не хвастается, но и жутко не тормозит. В либе присутствует только базовый функционал по отображению и сортировке, все прочие навороты придется допиливать самому. Из недостатков могу подметить, что последнее обновление на Google Code было в 2010 году. Скачать саму либу можно здесь.

Итак как ее использовать. Весь «изометрический мир» представляет собой одну (для простых проектов) или несколько изометрических сцен IsoScene, которые отображаются через вьюпорт IsoView. Создадим простейшую изометрическую сцену.

Собственно сетку IsoGrid можно было и не добавлять, но тогда бы мы увидели просто пустой экран, что было бы не очень наглядно.

В библиотеке присутствуют стандартные примитивы например IsoBox, которые больше подходят для тестирования и отладки, чем для практического использования, но для примера вполне подойдут. Кроме того имеется IsoSprite, это уже более полезный объект, сам он не имеет внешнего представления и является контейнером для DisplayObject-ов. Проще говоря помещаем DisplayObject или набор нескольких в IsoSprite и они становятся частью «изометрического мира». Добавим на сцену примитив IsoBox, IsoHexBox и IsoSprite.

О чем здесь следует сказать. Устанавливать размеры объекта (setSize(width, length, height) нужно обязательно. Иначе он не будет принимать участия в сортировке. Это не размер DisplayObject‘a, а размер объекта в изометрическом мире.

Перемещать объекты по изометрической сцене не сложнее, чем по обычной, у всех изометрических объектов имеются методы moveTo(x, y, z) и moveBy(x, y, z). Первый перемещает объект в указанные координаты. Второй смещает объект на указанное количество пикселей относительно текущей позиции. Координаты конечно нужно указывать в изометрической проекции, а не в экранной. Самим ничего естественно пересчитывать не придется, для этого в библиотеке есть класс IsoMath с соответствующими статическими методами isoToScreen() и screenToIso(). Кроме того у объекта IsoView есть удобные методы для перевода координат isoToLocal(), localToIso().
Напишем код, который будет перемещать объект IsoBox в координаты клика.

Как можно увидеть я беру не точные координаты клика, а округленные до ближайшего кратного GRIDSIDE (25), т.е. до ширины / длины ячейки. Хитрости никакой здесь нет, это делается чтобы объекты не пересекались, просто некрасиво.

Ну вот впрочем и все, остальное дело техники, переписывать сюда документацию особого смысла не вижу. Вводный экскурс по использованию библиотеки я вам дал, те кто заинтересуется может продолжить изучение либы в доках и ее исходниках.
И примерчик самого простенького редактора изометрической карты:

Добавить комментарий