О чем этот пример
В игровой разработке часто возникает задача трансформации данных, например, при повороте уровня, изменении вида игрового поля или генерации контента. Встроенная утилита Phaser `Phaser.Utils.Array.Matrix.RotateLeft` позволяет легко и эффективно повернуть двумерный массив (матрицу) на 90 градусов против часовой стрелки. Это полезно для создания вращающихся головоломок, процедурной генерации карт, изменения ориентации тайловых уровней или визуализации алгоритмов прямо в Canvas без сложных ручных вычислений.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
this.add.text(10, 10, 'Click to rotate the array matrix left', { font: '16px Courier', fill: '#ffffff' });
const text = this.add.text(200, 200, '', { font: '32px Courier', fill: '#00ff00' });
let matrix = [
[ 1, 1, 1, 1, 1, 1 ],
[ 2, 0, 0, 0, 0, 4 ],
[ 2, 0, 1, 2, 0, 4 ],
[ 2, 0, 3, 4, 0, 4 ],
[ 2, 0, 0, 0, 0, 4 ],
[ 3, 3, 3, 3, 3, 3 ]
];
text.setText(Phaser.Utils.Array.Matrix.MatrixToString(matrix));
this.input.on('pointerup', () =>
{
matrix = Phaser.Utils.Array.Matrix.RotateLeft(matrix);
text.setText(Phaser.Utils.Array.Matrix.MatrixToString(matrix));
});
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что делает RotateLeft?
Метод Phaser.Utils.Array.Matrix.RotateLeft принимает на вход двумерный массив (матрицу) и возвращает её новую копию, повёрнутую на 90 градусов против часовой стрелки. Это стандартная операция линейной алгебры, которая меняет строки на столбцы в обратном порядке.
Наглядно: если представить исходную матрицу как игровое поле, где каждая ячейка — это тайл, то после поворота левый край станет верхним, а верхний — правым. Это особенно удобно для работы с тайловыми данными уровня.
Разбор примера: Инициализация
В примере создаётся сцена, в которой при клике происходит поворот матрицы и её отрисовка. Сначала мы видим инициализацию матрицы и её отображение.
let matrix = [
[ 1, 1, 1, 1, 1, 1 ],
[ 2, 0, 0, 0, 0, 4 ],
[ 2, 0, 1, 2, 0, 4 ],
[ 2, 0, 3, 4, 0, 4 ],
[ 2, 0, 0, 0, 0, 4 ],
[ 3, 3, 3, 3, 3, 3 ]
];
Это матрица 6x6, представляющая собой, например, простой лабиринт или шаблон уровня, где разные числа — это типы тайлов (стены, полы, враги).
Для её отображения используется утилита Phaser.Utils.Array.Matrix.MatrixToString, которая форматирует матрицу в читаемую строку с переносами.
text.setText(Phaser.Utils.Array.Matrix.MatrixToString(matrix));
Объект text — это обычный Phaser.GameObjects.Text, который и показывает матрицу на экране.
Обработка ввода и поворот
Поворот привязан к событию клика мыши или касания. Вся логика находится внутри обработчика события pointerup.
this.input.on('pointerup', () => {
matrix = Phaser.Utils.Array.Matrix.RotateLeft(matrix);
text.setText(Phaser.Utils.Array.Matrix.MatrixToString(matrix));
});
Ключевая строка — это вызов Phaser.Utils.Array.Matrix.RotateLeft(matrix). Функция не изменяет исходный массив, а возвращает новый, повёрнутый. Поэтому результат присваивается обратно переменной matrix. После этого обновляется текст на экране, чтобы отобразить новое состояние матрицы.
Практическое применение в играх
Поворот матрицы — это не просто академическое упражнение. Вот несколько реальных сценариев:
* **Вращающиеся головоломки (как в играх типа «Bloxorz»):** Уровень можно хранить как матрицу препятствий и целей, а поворот — как действие игрока.
* **Процедурная генерация:** Создание одного шаблона комнаты и его повороты для увеличения разнообразия уровней.
* **Обработка тайловых карт:** Если ваша карта уровня — это массив ID тайлов, RotateLeft позволит мгновенно изменить её ориентацию.
* **Визуализация алгоритмов (поиск пути, симуляции):** Для отладки и демонстрации работы логики игры.
Важно помнить, что метод работает с прямоугольными (включая квадратные) массивами. Для неквадратных матриц результат будет иметь иную размерность (например, 6x4 превратится в 4x6).
Что попробовать дальше
Утилита Phaser.Utils.Array.Matrix.RotateLeft — это мощный, но простой инструмент для манипуляции данными уровня. Она избавляет от необходимости писать вложенные циклы для поворота данных вручную. Для экспериментов попробуйте: интегрировать поворот в игровую механику, привязав его к клавише; использовать поворот вместе с RotateRight для двустороннего вращения; или применить его к матрице, представляющей спрайты или группы объектов на сцене, чтобы динамически менять их расположение.
