О чем этот пример

Работа с двумерными массивами (матрицами) — частая задача в разработке игр: от карт уровней до систем инвентаря. Встроенный в Phaser метод `Phaser.Utils.Array.Matrix.RotateRight` позволяет одним вызовом повернуть матрицу на 90 градусов по часовой стрелке, экономя время и предотвращая ошибки в ручных вычислениях. Эта статья разбирает готовый пример, показывая, как интегрировать поворот матрицы в игровой цикл. Вы научитесь визуализировать изменения данных в реальном времени, что полезно для редакторов уровней или головоломок типа «Пятнашек».

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        this.add.text(10, 10, 'Click to rotate the array matrix', { 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.RotateRight(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);

Подготовка сцены и данных

В примере создаётся базовая сцена Phaser. В начале метода create() мы выводим инструкцию для пользователя и создаём текстовый объект text для отображения матрицы. Ключевой элемент — объявление самой матрицы matrix.

Это двумерный массив 6x6, где числа могут символизировать типы тайлов (1 — трава, 2 — стена и т.д.). Для начального отображения используется утилита Phaser.Utils.Array.Matrix.MatrixToString, которая форматирует матрицу в читаемую строку с переносами.

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));

Обработка клика и поворот

Логика поворота привязана к событию клика (pointerup). При каждом клике происходит три ключевых действия.

Во-первых, вызывается Phaser.Utils.Array.Matrix.RotateRight(matrix). Этот метод не изменяет исходную матрицу, а возвращает новую, повёрнутую на 90 градусов по часовой стрелке. Поэтому результат необходимо присвоить обратно переменной matrix.

Во-вторых, обновлённая матрица снова преобразуется в строку и устанавливается как текст объекта text. Это обеспечивает мгновенную визуальную обратную связь.

this.input.on('pointerup', () => {
    matrix = Phaser.Utils.Array.Matrix.RotateRight(matrix);
    text.setText(Phaser.Utils.Array.Matrix.MatrixToString(matrix));
});

Анализ результата и поведения

После нескольких кликов вы увидите, как исходная «рамка» из чисел поворачивается. Важно понимать поведение метода:

* **Создание нового массива:** Исходный массив не модифицируется. Это безопасно, если на старую матрицу есть другие ссылки. * **Изменение размеров:** Если исходная матрица имела размеры N x M, то после поворота размеры станут M x N. В нашем примере квадратная матрица 6x6 остаётся квадратной. * **Направление:** RotateRight — поворот по часовой стрелке. Для поворота против часовой стрелки можно вызвать метод три раза или реализовать свою функцию, используя ту же логику транспонирования и реверса строк.

Повторные клики будут продолжать вращать матрицу. После четырёх кликов она вернётся в исходное состояние.

Практическое применение в играх

Где это может пригодиться?

1. **Головоломки и тетрисо-подобные игры:** Поворот фигур (тетромино) перед установкой на поле. 2. **Редакторы карт:** Быстрое изменение ориентации заранее созданного шаблона местности или строения. 3. **Пошаговые тактики:** Поворот поля боя или расстановки юнитов для изменения угла обзора. 4. **Системы инвентаря:** Если слоты инвентаря представлены как матрица, а предмет занимает несколько ячеек (2x2), его можно повернуть для удобства размещения.

// Пример: поворот фигуры тетромино перед проверкой коллизий
let tetrominoShape = [
    [0, 1, 0],
    [1, 1, 1]
];
// Перед установкой фигуры на сетку:
tetrominoShape = Phaser.Utils.Array.Matrix.RotateRight(tetrominoShape);

Что попробовать дальше

Использование встроенного метода RotateRight — это эффективный и безошибочный способ манипуляции матрицами в Phaser. Он избавляет от необходимости писать и отлаживать собственные алгоритмы транспонирования. Для экспериментов попробуйте: 1. Связать поворот не с кликом, а с клавишей клавиатуры (например, UP). 2. Визуализировать матрицу не текстом, а спрайтами или цветными квадратами, создав простой редактор уровня. 3. Реализовать функцию RotateLeft, комбинируя RotateRight или работая с reverse() и циклами для строк и столбцов.