О чем этот пример
Основа любой игры на Phaser — это её медиафайлы: изображения, звуки, анимации. Без корректной загрузки этих ресурсов игра просто не запустится. В этой статье мы разберем, как правильно инициализировать сцену и загрузить все необходимые ассеты, используя методы жизненного цикла Phaser. Вы научитесь загружать статичные изображения и спрайтшиты — ключевые элементы для создания игровых объектов и анимаций. Рассматривая пример кода для второй части создания первой игры, мы увидим, как выглядит чистая заготовка сцены с методами `preload`, `create` и `update`, и поймем назначение каждого из них. Этот фундаментальный шаг — отправная точка для добавления игровой логики.
Версия 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 ()
{
}
update ()
{
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Структура класса сцены
Класс, расширяющий Phaser.Scene, является основным контейнером для логики вашей игры. Phaser автоматически вызывает его методы в определенном порядке.
class Example extends Phaser.Scene
{
preload ()
{
// Загрузка ассетов
}
create ()
{
// Инициализация игровых объектов
}
update ()
{
// Игровой цикл, вызывается постоянно
}
}
* preload(): Этот метод вызывается самым первым. Его единственная задача — загрузить все медиафайлы (картинки, аудио, спрайтшиты) в кеш игры. Пока загрузка не завершена, игра не перейдет к следующему этапу.
* create(): После успешной загрузки всех ресурсов Phaser вызывает этот метод один раз. Здесь вы создаете игровые объекты, настраиваете физику, анимации и начальное состояние игры.
* update(): Этот метод вызывается непрерывно, обычно 60 раз в секунду (в зависимости от частоты кадров). Здесь размещается основная игровая логика: проверка ввода, перемещение объектов, проверка столкновений.
Загрузка статичных изображений
Для загрузки обычных картинок (фон, платформы, предметы) используется метод this.load.image(). Первый аргумент — это уникальный строковый ключ, по которому вы будете обращаться к этому изображению в методе create(). Второй аргумент — путь к файлу.
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');
После выполнения этих строк в preload() изображения с ключами 'sky', 'ground', 'star' и 'bomb' становятся доступными в кеше сцены. Позже вы сможете создать из них спрайты, используя, например, this.add.image(x, y, 'sky') или this.physics.add.image(x, y, 'bomb').
Работа со спрайтшитами
Спрайтшит — это одно изображение, содержащее несколько кадров анимации, расположенных в виде сетки. Он необходим для создания анимированных персонажей или объектов.
this.load.spritesheet('dude', 'src/games/firstgame/assets/dude.png', { frameWidth: 32, frameHeight: 48 });
Метод this.load.spritesheet() принимает три основных аргумента:
1. Ключ ('dude'), по которому спрайтшит будет доступен.
2. Путь к файлу изображения.
3. Объект конфигурации, где frameWidth и frameHeight задают ширину и высоту одного кадра анимации.
Phaser автоматически «разрежет» большое изображение dude.png на множество маленьких кадров размером 32x48 пикселя. Эти кадры затем можно будет использовать для создания анимаций в методе create() с помощью API this.anims.create().
Конфигурация и запуск игры
Объект конфигурации передается в конструктор Phaser.Game и определяет основные параметры игрового инстанса.
const config = {
type: Phaser.AUTO, // Рендерер: WebGL или Canvas (выбирается автоматически)
width: 800, // Ширина игрового холста
height: 600, // Высота игрового холста
scene: Example // Класс сцены, которая будет запущена первой
};
const game = new Phaser.Game(config);
Создание экземпляра new Phaser.Game(config) — это точка входа. После этого Phaser возьмет управление на себя: создаст холст, начнет игровой цикл и запустит жизненный цикл указанной сцены (Example), последовательно вызывая preload(), create() и затем update().
Что попробовать дальше
Вы успешно разобрали каркас сцены Phaser и научились загружать ресурсы. Ключевой вывод: разделение логики на preload (загрузка), create (инициализация) и update (игровой цикл) делает код чистым и предсказуемым.
Для экспериментов попробуйте:
1. Добавить загрузку звукового файла с помощью this.load.audio().
2. Изменить размеры холста в объекте config и посмотреть, как меняется игра.
3. Загрузить другой спрайтшит и рассчитать его frameWidth и frameHeight, исходя из количества кадров в строке и столбце.
