О чем этот пример
Каждая игра – это непрерывное движение и изменение. Чтобы оживить статичное изображение, например, заставить его вращаться, нужно понимать жизненный цикл сцены в Phaser. В этой статье мы разберем, как работает метод `update` и свойство `rotation` на простом примере, который станет основой для любой анимации в ваших проектах. Вы научитесь создавать динамичные объекты, управляя их состоянием каждый кадр.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Demo extends Phaser.Scene
{
eye;
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('eye', 'assets/pics/lance-overdose-loader-eye.png');
}
create ()
{
this.eye = this.add.image(Phaser.Math.Between(0, 800), Phaser.Math.Between(0, 600), 'eye');
}
update ()
{
this.eye.rotation += 0.02;
}
}
Структура класса сцены
В Phaser 3 логика каждой игровой сцены инкапсулирована в класс, расширяющий Phaser.Scene. Три ключевых метода определяют её жизненный цикл: preload, create и update.
class Demo extends Phaser.Scene
{
eye;
preload ()
{
// ... загрузка ресурсов
}
create ()
{
// ... инициализация объектов
}
update ()
{
// ... обновление состояния каждый кадр
}
}
Объявление поля eye в начале класса делает эту переменную свойством экземпляра сцены. Это позволяет обращаться к объекту спрайта из любого метода класса, в частности, из update.
Загрузка и создание спрайта
Метод preload отвечает за предварительную загрузку изображений, звуков и других ресурсов. Здесь с помощью this.load.image мы загружаем картинку и назначаем ей текстовый ключ 'eye'.
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('eye', 'assets/pics/lance-overdose-loader-eye.png');
Метод create выполняется один раз после успешной загрузки всех ресурсов. Здесь происходит создание и первоначальная настройка игровых объектов. Спрайт добавляется на сцену с помощью this.add.image. Его начальные координаты задаются случайным образом в пределах 800x600 пикселей.
this.eye = this.add.image(Phaser.Math.Between(0, 800), Phaser.Math.Between(0, 600), 'eye');
Функция Phaser.Math.Between возвращает случайное целое число в заданном диапазоне, что позволяет спрайту появляться в разных местах при каждом запуске сцены.
Анимация в реальном времени через метод update
Сердце любой динамики в игре – метод update. Он вызывается автоматически на каждом кадре отрисовки (до 60 раз в секунду). Любая логика, связанная с непрерывным изменением состояния игры, должна находиться здесь.
update ()
{
this.eye.rotation += 0.02;
}
В данном коде каждые 16.6 миллисекунд (при 60 FPS) к свойству rotation спрайта this.eye прибавляется значение 0.02. Свойство rotation определяет угол поворота спрайта в радианах. Таким образом, спрайт равномерно вращается со скоростью примерно 0.02 радиана за кадр.
Важно: изменение свойства rotation напрямую влияет на трансформацию объекта при его отрисовке. Phaser 3 использует правостороннюю систему координат, где положительное значение вращает спрайт по часовой стрелке.
Почему именно так? Практические аспекты
Использование метода update для анимации – стандартный и наиболее производительный подход в игровых циклах. Это предсказуемо и даёт полный контроль над процессом.
* **Детерминированность:** Изменение на фиксированную величину за кадр (+= 0.02) даёт равномерное вращение, не зависящее от абсолютного времени, но зависящее от частоты кадров. На мощном и слабом компьютерах спрайт сделает один полный оборот за разное *реальное* время, но визуально анимация будет плавной в обоих случаях.
* **Производительность:** Операция сложения и присваивания значения свойству – одна из самых простых. В update можно выполнять десятки тысяч таких операций без потери производительности.
* **Гибкость:** Логику внутри update можно легко усложнить. Например, изменить скорость вращения в зависимости от действий игрока или внешних событий.
Что попробовать дальше
Комбинация метода update и свойства rotation – фундамент для создания плавной анимации вращения в Phaser 3. Этот паттерн распространяется на любые другие непрерывные изменения: перемещение (`x,y), масштабирование (scale), прозрачность (alpha). Для экспериментов попробуйте: заменить константу0.02на переменную и менять её по клику мыши; использоватьthis.eye.angle += 1для работы в градусах; или привязать скорость вращения к прошедшему времени с помощьюthis.eye.rotation += 0.001 * delta, гдеdelta– аргумент методаupdate(time, delta)`.
