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

Управление порядком данных — частая задача в разработке игр. Например, вам может понадобиться изменить порядок отрисовки объектов или приоритет обработки событий. Phaser предоставляет удобные утилиты для работы с массивами, и одна из них — `BringToTop`. Эта статья покажет, как с её помощью быстро переместить любой элемент массива в конец, что эквивалентно его поднятию наверх по индексу.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const data = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];

        this.add.text(10, 10, `Before: ${data.join(' - ')}`, { font: '16px Courier', fill: '#00ff00' });

        Phaser.Utils.Array.BringToTop(data, 'c');

        this.add.text(10, 40, `After:  ${data.join(' - ')}`, { font: '16px Courier', fill: '#00ff00' });
    }
}

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Что делает BringToTop?

Метод Phaser.Utils.Array.BringToTop находит в массиве первый элемент, который равен переданному значению, и перемещает его в конец массива. В контексте индексов это означает, что элемент становится последним (с наибольшим индексом). Если элемент не найден, массив остаётся без изменений.

Это особенно полезно при работе со списками объектов, где порядок имеет значение, например, для управления z-index (порядком отрисовки) спрайтов или обработки очередей.

Разбор примера кода

Рассмотрим простой пример, который демонстрирует работу метода. Создаётся массив символов от 'a' до 'g', выводится его исходное состояние, затем применяется BringToTop для элемента 'c', и результат отображается снова.

class Example extends Phaser.Scene
{
    create ()
    {
        const data = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];

        this.add.text(10, 10, `Before: ${data.join(' - ')}`, { font: '16px Courier', fill: '#00ff00' });

        Phaser.Utils.Array.BringToTop(data, 'c');

        this.add.text(10, 40, `After:  ${data.join(' - ')}`, { font: '16px Courier', fill: '#00ff00' });
    }
}

В методе create сцены мы: 1. Объявляем массив data. 2. Добавляем текстовый объект с помощью this.add.text, отображающий исходный массив через join(' - '). 3. Вызываем Phaser.Utils.Array.BringToTop(data, 'c'), где data — целевой массив, а 'c' — значение для перемещения. 4. Добавляем второй текстовый объект, показывающий изменённый массив.

Как это работает на практике?

После вызова BringToTop элемент 'c' перемещается из своей позиции (индекс 2) в конец массива. Исходный порядок остальных элементов сохраняется.

**До вызова:** - Индексы: 0:a, 1:b, 2:c, 3:d, 4:e, 5:f, 6:g

**После вызова:** - Индексы: 0:a, 1:b, 2:d, 3:e, 4:f, 5:g, 6:c

Метод модифицирует исходный массив, а не возвращает новый. Это важно учитывать, чтобы избежать неожиданных изменений данных.

Зачем это нужно в играх?

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

Например, чтобы вывести спрайт игрока на передний план при столкновении:

// Предположим, children — это массив спрайтов в группе
Phaser.Utils.Array.BringToTop(children, playerSprite);

Также метод полезен для логических очередей, где нужно «обновить» элемент, переместив его в конец для последующей обработки.

Важные нюансы использования

Помните о следующих моментах: - Метод ищет **первое** вхождение значения. Если в массиве есть дубликаты, переместится только первый найденный. - Для сравнения используется строгое равенство (===). Убедитесь, что передаёте тот же объект или примитив. - Если элемент не найден, массив не изменится, и ошибки не произойдёт.

Для работы с объектами, где нужно сравнивать по свойству (например, id), может потребоваться собственная реализация или другие методы, такие как BringToTop в Phaser.GameObjects.Container, который работает с дочерними элементами.

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

Phaser.Utils.Array.BringToTop — это простая, но мощная утилита для управления порядком элементов в массиве. Она отлично подходит для задач, связанных с порядком отрисовки или приоритетом в играх. Попробуйте экспериментировать: используйте её для создания системы карт в колоде, где сыгранная карта перемещается в конец, или для управления слоями UI, чтобы важные окна всегда были наверху.