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

В игровой разработке часто возникают задачи по работе с двумерными данными: уровни, карты, инвентари. Умение манипулировать этими структурами — ключ к созданию динамичного геймплея. В этой статье разберем, как использовать встроенные утилиты Phaser для эффективного вращения матриц, что пригодится для реализации поворота фигур в тетрисе, изменения вида уровня или преобразования данных игрового поля. Мы рассмотрим конкретный пример, используя методы `Phaser.Utils.Array.Matrix.RotateRight` и `MatrixToString`, и объясним, как интегрировать эту логику в отзывчивую игровую сцену.

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

Живой запуск

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

Исходный код


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

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

В методе create() инициализируется сцена. Сперва создаются два текстовых объекта: один для инструкции, другой — для визуализации самой матрицы.

Затем объявляется исходная матрица 6x6. Это двумерный массив чисел, который может представлять собой, например, упрощенную карту тайлов, где каждое число — тип тайла.

Для отображения матрицы в читаемом виде используется утилита 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));

Обработка пользовательского ввода

Чтобы сделать пример интерактивным, мы навешиваем обработчик события клика (или касания) с помощью this.input.on('pointerup', ...). Каждый клик будет запускать операцию вращения матрицы.

Это стандартный для Phaser способ реагирования на действия игрока. Логика вращения инкапсулирована в колбеке этой функции.

this.input.on('pointerup', () => {
    // Логика вращения будет здесь
});

Ядро операции: RotateRight

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

Алгоритм работает корректно для матриц любого размера N x M. После получения нового массива мы обновляем текстовый объект, чтобы изменения сразу отобразились на экране.

matrix = Phaser.Utils.Array.Matrix.RotateRight(matrix);
text.setText(Phaser.Utils.Array.Matrix.MatrixToString(matrix));

Конфигурация и запуск игры

Как и в любом проекте на Phaser, нам нужна базовая конфигурация. В объекте config указывается тип рендерера, родительский контейнер в HTML и стартовая сцена.

Затем создается экземпляр игры new Phaser.Game(config), который инициализирует все системы и запускает сцену Example.

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

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

Вращение матрицы — мощный и часто необходимый инструмент в арсенале игрового разработчика. Используя встроенные утилиты Phaser, вы избегаете написания сложного и подверженного ошибкам кода. Для экспериментов попробуйте привязать вращение не к клику, а к клавише клавиатуры, реализовать анимацию поворота или использовать эту технику для поворота спрайтов, данные которых хранятся в матричной форме (например, пиксель-арт объекты или блоки тетриса).