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

В игровом движке Phaser физика и графика часто существуют отдельно. Прямоугольник или круг, нарисованный на сцене, не будет сталкиваться с миром или другими объектами, пока не получит физическое тело. Эта статья покажет, как превратить статичный графический примитив в полноценного физического персонажа, управляемого с клавиатуры. Вы научитесь связывать графические объекты с физикой Arcade, настраивать управление и задавать поведение тела. Этот подход универсален и пригодится для создания прототипов игровых механик, где нужно быстро добавить физику к любой фигуре.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    player;
    cursors;

    create ()
    {
        this.player = this.add.rectangle(400, 300, 64, 64, 0xffffff);

        this.physics.add.existing(this.player, false);

        this.cursors = this.input.keyboard.createCursorKeys();

        this.player.body.setCollideWorldBounds(true);
    }

    update ()
    {
        this.player.body.setVelocity(0);

        if (this.cursors.left.isDown)
        {
            this.player.body.setVelocityX(-300);
        }
        else if (this.cursors.right.isDown)
        {
            this.player.body.setVelocityX(300);
        }

        if (this.cursors.up.isDown)
        {
            this.player.body.setVelocityY(-300);
        }
        else if (this.cursors.down.isDown)
        {
            this.player.body.setVelocityY(300);
        }
    }
}

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    backgroundColor: '#0072bc',
    width: 800,
    height: 600,
    physics: {
        default: 'arcade',
        arcade: {
            debug: true
        }
    },
    scene: Example
};

const game = new Phaser.Game(config);

Создание графического объекта и включение физики

В методе create() сцены мы сначала создаём визуальный объект — белый прямоугольник. Затем с помощью системы физики Arcade добавляем ему физическое тело. Это ключевой шаг: без него объект будет просто картинкой.

Обратите внимание на второй аргумент false в вызове this.physics.add.existing(). Он указывает, что тело будет статическим (static) по умолчанию. Однако в следующей строке мы позволяем телу двигаться, включая столкновение с границами мира.

this.player = this.add.rectangle(400, 300, 64, 64, 0xffffff);
this.physics.add.existing(this.player, false);
this.player.body.setCollideWorldBounds(true);

Настройка управления с клавиатуры

Чтобы управлять персонажем, нам нужен доступ к состоянию клавиш. Phaser предоставляет удобный объект cursors для стрелок на клавиатуре. Мы создаём его один раз в create() и затем используем в каждом кадре в update() для проверки нажатий.

this.cursors = this.input.keyboard.createCursorKeys();

Обработка ввода и применение скорости

Вся логика движения происходит в методе update(), который вызывается на каждом кадре игры. Сначала мы сбрасываем скорость тела по обеим осям к нулю. Это важно, чтобы движение прекращалось, когда клавиша отпущена.

Затем мы проверяем состояние каждой из клавиш-стрелок. Если клавиша нажата (isDown), мы устанавливаем соответствующую компоненту скорости тела (setVelocityX или setVelocityY). Физический движок Arcade автоматически применит эту скорость и обновит позицию нашего графического прямоугольника.

this.player.body.setVelocity(0);

if (this.cursors.left.isDown)
{
    this.player.body.setVelocityX(-300);
}
else if (this.cursors.right.isDown)
{
    this.player.body.setVelocityX(300);
}

if (this.cursors.up.isDown)
{
    this.player.body.setVelocityY(-300);
}
else if (this.cursors.down.isDown)
{
    this.player.body.setVelocityY(300);
}

Конфигурация игры и сцены

Для работы примера необходима правильная настройка игры. В конфигурационном объекте мы явно указываем, что используем физический плагин 'arcade', и включаем отладочный режим (debug: true). В этом режиме физические тела будут отображаться с контуром, что помогает визуально контролировать их размер и положение.

const config = {
    type: Phaser.AUTO,
    physics: {
        default: 'arcade',
        arcade: {
            debug: true
        }
    },
    scene: Example
};

const game = new Phaser.Game(config);

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

Вы успешно создали базового управляемого персонажа, связав графический примитив с физическим телом. Теперь прямоугольник может двигаться и сталкиваться с границами экрана. Для экспериментов попробуйте изменить начальные параметры add.rectangle (цвет, размер), скорость движения или заменить прямоугольник на другой объект, например this.add.circle(). Чтобы добавить взаимодействие, создайте второе тело и используйте метод this.physics.add.collider(player, otherObject).