Phaser — мощная библиотека для разработки 2D-игр на JavaScript, предоставляющая инструменты для работы с различными типами тайловых карт. Среди них особое место занимают изометрические и гексагональные карты, которые позволяют создавать сложные визуальные миры с нестандартной перспективой и сеткой. Эти карты отличаются от обычной прямоугольной сетки формой тайлов, системой координат и особенностями рендеринга.
Изометрическая карта имитирует трёхмерное пространство на плоском экране. Каждый тайл выглядит как ромб, а объекты на карте располагаются так, чтобы создать иллюзию глубины.
Ключевые характеристики:
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
scene: {
preload,
create
}
};
const game = new Phaser.Game(config);
function preload() {
this.load.image('tiles', 'assets/tiles.png');
this.load.tilemapTiledJSON('isoMap', 'assets/isoMap.json');
}
function create() {
const map = this.make.tilemap({ key: 'isoMap', tileWidth: 64, tileHeight: 32 });
const tileset = map.addTilesetImage('tiles', 'tiles');
const layer = map.createLayer('Ground', tileset);
layer.setDepth(layer.y); // важный шаг для правильного наложения объектов
}
Изометрическая карта использует систему координат тайлов
(tileX, tileY), которая преобразуется в экранные
координаты:
[ screenX = (tileX - tileY) * tileWidth / 2] [ screenY = (tileX + tileY) * tileHeight / 2]
Phaser автоматически поддерживает это через свой isometric
plugin или встроенные методы при правильной настройке
tileWidth и tileHeight.
Гексагональные карты состоят из шестиугольных тайлов, обеспечивающих равномерное соседство во всех направлениях и более естественную сетку для стратегических игр.
Типы гексагонов:
Гексагональные карты могут использовать несколько систем координат:
(x, y, z) с ограничением
x + y + z = 0.(q, r).Phaser поддерживает гексагональные карты через
tilemap.createLayer и настройку типа тайла в редакторе
Tiled (hexagonal).
function preload() {
this.load.image('hexTiles', 'assets/hexTiles.png');
this.load.tilemapTiledJSON('hexMap', 'assets/hexMap.json');
}
function create() {
const map = this.make.tilemap({ key: 'hexMap', tileWidth: 64, tileHeight: 56 });
const tileset = map.addTilesetImage('hexTiles', 'hexTiles');
const layer = map.createLayer('HexLayer', tileset);
// Установка правильной глубины для корректного наложения
layer.forEachTile(tile => {
tile.pixelY = tile.y * map.tileHeight * 0.75;
});
}
Особенности рендеринга гексагонов:
pointy-topped каждая строка смещается на половину
тайла.flat-topped смещается каждый столбец.y или
q+r, чтобы избежать пересечений.В изометрических и гексагональных картах важно учитывать координаты тайлов при взаимодействии:
const tile = map.getTileAtWorldXY(pointer.x, pointer.y, true, this.cameras.main, layer);
Для изометрической карты необходимо преобразовывать целевые координаты в тайловую сетку. Для гексагональной карты полезно использовать кубические или осевые координаты для расчёта пути и соседей.
cull и renderLayer для
отрисовки только видимой части карты.dynamic layer с обновлением
видимой области.Изометрические и гексагональные карты позволяют создавать более динамичные и визуально сложные миры, расширяя возможности игр на Phaser за пределы прямоугольной сетки. Точная работа с координатами, глубиной и рендерингом обеспечивает реалистичное ощущение пространства и корректное взаимодействие объектов.