О чем этот пример
Создание классической игры "Змейка" — отличный способ освоить основы Phaser. Эта статья проведет вас через первый шаг: настройку проекта, загрузку графики и подготовку игровой сцены. Вы поймете базовую структуру кода и принципы работы с загрузчиком, что станет фундаментом для любого игрового проекта на этом движке.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('food', 'assets/games/snake/food.png');
this.load.image('body', 'assets/games/snake/body.png');
}
create ()
{
}
update (time, delta)
{
}
}
const config = {
type: Phaser.WEBGL,
width: 640,
height: 480,
backgroundColor: '#bfcc00',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Структура класса сцены
В Phaser вся игровая логика организуется в сценах (Scenes). Класс сцены — это основа вашей игры.
class Example extends Phaser.Scene
{
preload ()
{
// ... загрузка ресурсов
}
create ()
{
// ... инициализация объектов
}
update (time, delta)
{
// ... игровой цикл
}
}
Класс наследуется от Phaser.Scene и содержит три ключевых метода:
* preload(): вызывается один раз в самом начале для загрузки изображений, звуков и других ассетов.
* create(): вызывается после preload для создания и настройки игровых объектов.
* update(): вызывается непрерывно на каждом кадре игры (обычно 60 раз в секунду) для обновления состояния (движение, столкновения, логика).
Загрузка ресурсов в preload()
Перед тем как использовать изображения, их необходимо загрузить в кеш движка. Это делается в методе preload().
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('food', 'assets/games/snake/food.png');
this.load.image('body', 'assets/games/snake/body.png');
}
* `this.load.setBaseURL()` устанавливает базовый URL для всех последующих загрузок. Это позволяет указывать только относительные пути к файлам.
* `this.load.image(key, url)` загружает изображение и присваивает ему строковый ключ. Позже по этому ключу (например, `'food'`) мы сможем создать спрайт. В нашем случае загружаются два спрайта: еда (`food`) и сегмент тела змейки (`body`).
Конфигурация и запуск игры
После описания сцены необходимо создать объект конфигурации и запустить саму игру.
const config = {
type: Phaser.WEBGL,
width: 640,
height: 480,
backgroundColor: '#bfcc00',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Объект config определяет основные параметры:
* type: Рендерер. Phaser.WEBGL использует аппаратное ускорение, но можно указать Phaser.CANVAS.
* width / height: Размер игрового поля в пикселях.
* backgroundColor: Цвет фона в HEX-формате.
* parent: ID HTML-элемента на странице, в который будет встроен canvas игры. Если элемент не найден, canvas добавится в document.body.
* scene: Класс главной сцены, которая будет запущена сразу после инициализации игры.
Создание экземпляра new Phaser.Game(config) запускает весь жизненный цикл.
Что дальше? Подготовка к игровой логике
Сейчас наша сцена пуста. В следующих шагах в методах create() и update() мы добавим:
1. **В create():** Создание змейки из нескольких сегментов (body), появление первой еды (food) на поле, настройку управления с клавиатуры.
2. **В update():** Логику движения змейки по сетке, проверку на поедание еды (столкновение головы с food), рост змейки и проверку на столкновение со стенами или собственным телом.
Пока что убедитесь, что загрузка ресурсов работает корректно и в консоли браузера нет ошибок 404 ("Not Found") для файлов food.png и body.png.
Что попробовать дальше
Вы успешно создали каркас для игры "Змейка" на Phaser. Мы разобрали структуру сцены, загрузку ресурсов и конфигурацию игры. Для экспериментов попробуйте: изменить цвет фона (backgroundColor), размер игрового окна, загрузить свои изображения или добавить простой спрайт в метод create() с помощью this.add.image(x, y, 'food').
