Phaser — мощная библиотека для разработки 2D-игр на JavaScript, где
архитектура сцен играет ключевую роль. Каждая сцена представляет собой
отдельный жизненный цикл с методами preload,
create, update и другими. Важной задачей при
построении сложных игр становится обмен данными между
сценами, особенно при переходе от одной сцены к другой. Одним
из наиболее элегантных решений является использование метода
init.
init в сценеМетод init вызывается перед preload
и create при запуске сцены. Его основное
назначение — принять и подготовить данные, которые будут использоваться
в этой сцене. В отличие от глобальных переменных или менеджеров
состояния, init позволяет передавать данные локально и
безопасно, минимизируя побочные эффекты.
Сигнатура метода проста:
init(data) {
this.dataFromPreviousScene = data;
}
data — объект с любыми значениями, которые необходимо
передать.init обычно создаются свойства сцены для
хранения этих данных.Для передачи данных используется метод scene.start,
который может принимать объект с данными в качестве второго
аргумента:
this.scene.start('GameScene', { score: 150, playerName: 'Alex' });
В целевой сцене эти данные принимаются в методе
init:
class GameScene extends Phaser.Scene {
constructor() {
super({ key: 'GameScene' });
}
init(data) {
this.score = data.score || 0;
this.playerName = data.playerName || 'Player';
}
create() {
this.add.text(100, 100, `Игрок: ${this.playerName}`, { fontSize: '24px', fill: '#fff' });
this.add.text(100, 150, `Счёт: ${this.score}`, { fontSize: '24px', fill: '#fff' });
}
}
Ключевой момент: init вызывается каждый раз при
запуске сцены, даже если она уже была загружена ранее, что
делает его удобным для обновления состояния.
init позволяет передавать не только примитивные
значения, но и сложные структуры, включая массивы,
объекты и даже экземпляры классов:
const playerData = {
name: 'Alex',
inventory: ['sword', 'shield'],
stats: { hp: 100, mana: 50 }
};
this.scene.start('GameScene', { player: playerData });
В сцене:
init(data) {
this.player = data.player;
this.player.inventory.push('potion'); // можно модифицировать копию объекта
}
При работе с большими объектами важно помнить, что Phaser не
клонирует объект автоматически. Если требуется независимая копия,
необходимо использовать глубокое копирование
(JSON.parse(JSON.stringify(obj)) или специализированные
функции).
init и data менеджером сценыPhaser также предоставляет Scene Data Manager
(this.data) для хранения состояния, доступного между
сценами. Однако метод init имеет ряд преимуществ:
Пример:
// Менеджер данных
this.data.set('score', 200);
this.scene.start('GameScene'); // data сохраняется между сценами
// Использование init
this.scene.start('GameScene', { score: 200 }); // данные передаются локально
Использование init делает код более предсказуемым и
безопасным.
const levelData = {
levelNumber: 3,
enemies: ['goblin', 'orc'],
bonusPoints: 50
};
this.scene.start('LevelScene', levelData);
init:init(data) {
this.levelNumber = data.levelNumber;
this.enemies = data.enemies;
this.bonusPoints = data.bonusPoints;
}
create:create() {
this.add.text(50, 50, `Уровень ${this.levelNumber}`, { fontSize: '28px', fill: '#fff' });
this.enemies.forEach((enemy, index) => {
this.add.text(50, 100 + index * 30, `Враг: ${enemy}`, { fontSize: '20px', fill: '#f00' });
});
}
initdata.score || 0.init объекты, которые требуют асинхронной
загрузки. Для этого лучше использовать preload или
create.init
и Scene Data Manager, сохраняя ключевые ссылки через
init.init для передачи временных
параметров сцены, а глобальный data менеджер — для
постоянного состояния игры.Метод init обеспечивает гибкую и
структурированную передачу данных, позволяя строить сцены как
независимые, переиспользуемые модули с предсказуемым поведением.