Registry: глобальное хранилище данных

В Phaser Registry представляет собой глобальное хранилище данных, которое позволяет управлять переменными, доступными во всех сценах игры. Это мощный инструмент для передачи информации между различными частями приложения, управления состоянием игры и реализации глобальных настроек.


Создание и доступ к Registry

Registry создается автоматически вместе с экземпляром игры Phaser, и доступ к нему можно получить через объект сцены:

class MyScene extends Phaser.Scene {
    create() {
        // Получение доступа к Registry
        const registry = this.registry;
        
        // Добавление значения
        registry.set('score', 0);
        
        // Получение значения
        let score = registry.get('score');
        console.log(score); // 0
    }
}

Ключевое свойство registry сцены предоставляет интерфейс для добавления, удаления и отслеживания изменений данных. Все данные хранятся в формате ключ-значение.


Основные методы Registry

  1. set(key, value) — сохраняет значение по указанному ключу. Пример:
this.registry.set('playerName', 'Alice');
  1. get(key) — возвращает значение, связанное с ключом. Пример:
let name = this.registry.get('playerName'); // 'Alice'
  1. has(key) — проверяет наличие ключа в Registry, возвращает true или false. Пример:
if (this.registry.has('level')) {
    console.log('Уровень задан');
}
  1. delete(key) — удаляет ключ и связанное с ним значение. Пример:
this.registry.delete('tempData');
  1. merge(object) — объединяет объект с текущими данными Registry, добавляя новые ключи или обновляя существующие. Пример:
this.registry.merge({ lives: 3, difficulty: 'easy' });
  1. values — возвращает объект всех данных Registry. Используется для перебора всех элементов. Пример:
console.log(this.registry.values);

События Registry

Registry поддерживает систему событий, позволяющую отслеживать изменения данных. Это особенно полезно для обновления интерфейса или логики игры при изменении глобальных переменных.

  • changedata — вызывается при изменении любого значения.
this.registry.events.on('changedata', (parent, key, value) => {
    console.log(`Ключ ${key} изменён на ${value}`);
});
  • changedata-key — вызывается при изменении конкретного ключа.
this.registry.events.on('changedata-score', (parent, value) => {
    console.log(`Очки обновлены: ${value}`);
});
  • remove — событие удаления ключа.
this.registry.events.on('remove', (parent, key) => {
    console.log(`Ключ ${key} удалён`);
});

Использование Registry для передачи данных между сценами

Registry идеально подходит для хранения информации, которая должна быть доступна во всех сценах. Например, текущий счет, уровень игрока или настройки игры.

class SceneA extends Phaser.Scene {
    create() {
        this.registry.set('score', 10);
        this.scene.start('SceneB');
    }
}

class SceneB extends Phaser.Scene {
    create() {
        let score = this.registry.get('score');
        console.log(`Счет из SceneA: ${score}`); // 10
    }
}

Обновление интерфейса через Registry

События Registry позволяют автоматически обновлять HUD или интерфейс при изменении данных.

class UIScene extends Phaser.Scene {
    create() {
        this.scoreText = this.add.text(10, 10, 'Score: 0');

        this.registry.events.on('changedata-score', (parent, value) => {
            this.scoreText.setText(`Score: ${value}`);
        });
    }
}

// Где-то в другой сцене
this.registry.set('score', 5); // UIScene автоматически обновит текст

Слияние данных и шаблоны инициализации

Registry поддерживает установку начальных значений через объект при запуске игры:

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    scene: [SceneA, SceneB],
    plugins: {
        global: [{
            key: 'Registry',
            plugin: Phaser.Data.DataManager,
            start: true
        }]
    }
};

const game = new Phaser.Game(config);

game.registry.merge({
    score: 0,
    lives: 3,
    level: 1
});

Такой подход позволяет централизованно хранить настройки игры и использовать их во всех сценах без дублирования кода.


Рекомендации по использованию Registry

  • Использовать Registry для глобального состояния игры, а не для локальных переменных сцены.
  • Применять события Registry для синхронизации интерфейса и игровых механик.
  • Для сложных объектов или массивов использовать клонирование при чтении или записи, чтобы избежать непреднамеренных мутаций.

Registry является надежным инструментом для управления состоянием, обеспечивая чистый и модульный подход к обмену данными между сценами и элементами игры.