О чем этот пример
Первые шаги в разработке на Phaser 3 начинаются с понимания жизненного цикла сцены. В этой статье мы разберем базовый шаблон, который показывает, как правильно загружать изображения и спрайты в память и выводить их на игровой экран. Вы освоите фундаментальные методы `preload()` и `create()`, без которых не обходится ни одна игра.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
// this.load.setBaseURL('https://cdn.phaserfiles.com/v385');
this.load.image('sky', 'src/games/firstgame/assets/sky.png');
this.load.image('ground', 'src/games/firstgame/assets/platform.png');
this.load.image('star', 'src/games/firstgame/assets/star.png');
this.load.image('bomb', 'src/games/firstgame/assets/bomb.png');
this.load.spritesheet('dude', 'src/games/firstgame/assets/dude.png', { frameWidth: 32, frameHeight: 48 });
}
create ()
{
this.add.image(400, 300, 'sky');
}
update ()
{
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Структура класса сцены
В Phaser 3 основная логика игры организуется в классах, расширяющих Phaser.Scene. Каждая сцена имеет три ключевых метода, которые вызываются движком автоматически в определенном порядке.
class Example extends Phaser.Scene
{
preload ()
{
}
create ()
{
}
update ()
{
}
}
Метод preload() выполняется самым первым и предназначен для загрузки всех необходимых ресурсов (изображений, звуков, данных). Метод create() вызывается один раз после успешной загрузки всех ресурсов из preload() и служит для создания и настройки игровых объектов. Метод update() выполняется на каждом кадре игры (до 60 раз в секунду) и используется для обновления логики, например, перемещения персонажей.
Загрузка ресурсов в preload()
Чтобы использовать в игре картинку или анимацию, ее сначала нужно загрузить в кеш движка. Для этого используется объект this.load, доступный внутри метода preload().
preload ()
{
this.load.image('sky', 'src/games/firstgame/assets/sky.png');
this.load.image('ground', 'src/games/firstgame/assets/platform.png');
this.load.image('star', 'src/games/firstgame/assets/star.png');
this.load.image('bomb', 'src/games/firstgame/assets/bomb.png');
this.load.spritesheet('dude', 'src/games/firstgame/assets/dude.png', { frameWidth: 32, frameHeight: 48 });
}
Метод this.load.image() загружает обычное статичное изображение. Первый аргумент ('sky') — это уникальный строковый ключ, по которому вы будете обращаться к этому ресурсу в коде. Второй аргумент — путь к файлу.
Метод this.load.spritesheet() загружает изображение, которое представляет собой набор кадров анимации (спрайтшит). Помимо ключа и пути, он принимает объект конфигурации, где frameWidth и frameHeight задают размер одного кадра.
Создание объектов в create()
После того как все ресурсы загружены, можно создавать игровые объекты. В данном примере на сцену добавляется фоновое изображение.
create ()
{
this.add.image(400, 300, 'sky');
}
Метод this.add.image() создает новый объект изображения (Image Game Object) и сразу добавляет его на сцену. Аргументы 400 и 300 — это координаты X и Y центра изображения. Поскольку размер игрового мира в конфигурации указан как 800x600, эти координаты поместят изображение ровно в центр экрана. Третий аргумент 'sky' — это ключ ресурса, который был задан при загрузке в preload().
Конфигурация и запуск игры
Экземпляр игры Phaser.Game создается один раз и является точкой входа. Его конфигурация определяет базовые параметры рендеринга и начальную сцену.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
В объекте config:
- type: Phaser.AUTO позволяет движку автоматически выбрать способ рендеринга (WebGL или Canvas).
- width и height: задают размер игрового холста.
- scene: указывает класс сцены, которая будет запущена сразу после инициализации движка. Передавать нужно сам класс (Example), а не его экземпляр.
Что попробовать дальше
Вы освоили базовый каркас игры на Phaser 3: создание сцены, загрузку ресурсов и отрисовку фона. Это основа для любого более сложного проекта. Для экспериментов попробуйте:
1. Изменить координаты в this.add.image() и посмотреть, как двигается фон.
2. Добавить в create() отрисовку других загруженных изображений ('ground', 'star') на разных слоях.
3. Заменить путь в this.load.image() на URL любой картинки из интернета, чтобы понять принцип загрузки внешних ресурсов.
