О чем этот пример

Управление ресурсами — ключевой навык при разработке игр. В Phaser метод `destroy()` позволяет освобождать память, удаляя ненужные игровые объекты. Этот пример показывает, как точечно уничтожать текстовые объекты, сохраняя остальные элементы сцены неизменными. Понимание этого механизма поможет избежать утечек памяти и повысит производительность вашей игры.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


function preload ()
{
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('apple', 'assets/sprites/apple.png');
}

function create()
{
    this.add.text(100, 100, 'Phaser', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });

    let t = this.add.text(100, 200, 'Phaser', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });

    this.add.text(100, 300, 'Phaser', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });

    this.input.once('pointerdown', () => {

        t.destroy();

    });
}

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: {
        preload: preload,
        create: create
    }
  };

const game = new Phaser.Game(config);

Загрузка ресурсов и создание сцены

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

function preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('apple', 'assets/sprites/apple.png');
}

Функция create вызывается после загрузки ресурсов и создает три текстовых объекта с одинаковым стилем. Обратите внимание, что второй объект сохраняется в переменную `t` — это ключевой момент для последующего управления.

Создание и хранение текстовых объектов

Метод this.add.text создает объект Phaser.GameObjects.Text. Первые два аргумента — это координаты X и Y, третий — строковое содержимое, четвертый — объект стиля.

function create()
{
    this.add.text(100, 100, 'Phaser', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });

    let t = this.add.text(100, 200, 'Phaser', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });

    this.add.text(100, 300, 'Phaser', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });

Сохранение ссылки на объект в переменную `t` дает нам контроль именно над этим экземпляром. Два других текстовых объекта создаются анонимно и не могут быть изменены или удалены позже (если только не найти их через другие методы сцены).

Обработка клика и уничтожение объекта

Здесь мы навешиваем одноразовый обработчик события pointerdown (клик мышью или касание). При срабатывании вызывается метод destroy() для объекта `t`.

this.input.once('pointerdown', () => {
        t.destroy();
    });
}

this.input.once гарантирует, что обработчик выполнится лишь один раз. Метод destroy() удаляет текстовый объект `t` из текущей сцены, освобождает связанные с ним ресурсы и убирает его с экрана. Два других текста останутся нетронутыми.

Конфигурация и запуск игры

Объект config определяет основные настройки игры Phaser. Здесь важно указать функции preload и create в свойстве scene.

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: {
        preload: preload,
        create: create
    }
};

const game = new Phaser.Game(config);

Создание экземпляра new Phaser.Game(config) запускает игровой цикл. Указание Phaser.WEBGL в качестве типа рендерера обеспечивает аппаратное ускорение, если оно доступно в браузере.

Что попробовать дальше

Метод destroy() — это ваш основной инструмент для ручного управления жизненным циклом игровых объектов в Phaser. Экспериментируйте: попробуйте уничтожать объекты по таймеру, при столкновениях или после определенного события. Можно также сохранять ссылки на все объекты в массив для группового удаления. Помните — удаление неиспользуемых объектов помогает поддерживать высокий FPS.