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

При разработке игр часто приходится работать с массивами игровых объектов, спрайтов или данных. Чтобы быстро найти нужный элемент по его свойствам, Phaser предоставляет удобные методы `GetFirst` и `GetLast`. Эта статья объяснит, как они работают и почему они полезны для оптимизации вашего кода. Вместо ручного перебора массива с циклом `for` вы можете использовать готовые функции из библиотеки Phaser. Они не только сокращают количество кода, но и позволяют легко находить элементы по заданному значению свойства, что особенно удобно при управлении видимостью, активностью или состоянием объектов.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const array = [
            { name: 'Alice', visible: true },
            { name: 'Bob', visible: false },
            { name: 'Charlie', visible: true },
            { name: 'Dave', visible: false },
            { name: 'Eve', visible: true }
        ];
        const property = 'visible';
        const value = false;

        const getFirst = Phaser.Utils.Array.GetFirst(array, property, value, 0);
        console.log(getFirst);
        const getLast = Phaser.Utils.Array.GetFirst(array, property, value, -1);
        console.log(getLast);
    }
}

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    backgroundColor: '#2d2d88',
    scene: Example
};

const game = new Phaser.Game(config);

Что такое GetFirst и GetLast?

Методы Phaser.Utils.Array.GetFirst и Phaser.Utils.Array.GetLast — это часть утилит Phaser для работы с массивами. Они предназначены для поиска элементов в массиве по значению конкретного свойства.

GetFirst возвращает первый элемент массива, который соответствует условию, а GetLast — последний. Оба метода принимают одинаковые параметры, но последний параметр (startIndex) определяет направление поиска.

const getFirst = Phaser.Utils.Array.GetFirst(array, property, value, 0);
const getLast = Phaser.Utils.Array.GetFirst(array, property, value, -1);

В примере выше GetLast фактически вызывается через GetFirst с параметром startIndex равным -1. Это особенность API: GetLast реализован как вариант GetFirst с обратным поиском.

Параметры метода GetFirst

Метод GetFirst принимает четыре аргумента: 1. array — массив объектов, в котором нужно вести поиск. 2. property — имя свойства объекта, по которому будет проверка. 3. value — ожидаемое значение свойства для совпадения. 4. startIndex — индекс, с которого начинается поиск. Если `0, поиск идет с начала массива; если-1, поиск идет с конца (эффективно работает какGetLast`).

const array = [
    { name: 'Alice', visible: true },
    { name: 'Bob', visible: false },
    { name: 'Charlie', visible: true },
    { name: 'Dave', visible: false },
    { name: 'Eve', visible: true }
];
const property = 'visible';
const value = false;

В этом примере мы ищем объекты, у которых свойство visible равно false. Массив содержит пять объектов с разными значениями видимости.

Как работает поиск с начала (GetFirst)

Когда startIndex равен `0, метод начинает проверку с первого элемента массива и движется вперед. Он сравнивает значение указанного свойства каждого объекта с заданнымvalue`. Когда найдено совпадение, метод возвращает этот объект.

const getFirst = Phaser.Utils.Array.GetFirst(array, property, value, 0);
console.log(getFirst); // Выведет { name: 'Bob', visible: false }

В нашем массиве первый объект с visible: false — это Bob. Метод возвращает именно его, игнорируя последующие совпадения (Dave). Это полезно, когда вам нужен самый ранний объект, удовлетворяющий условию, например, первый невидимый спрайт для его активации.

Как работает поиск с конца (GetLast)

Когда startIndex равен -1, метод начинает проверку с последнего элемента массива и движется назад. Он также сравнивает свойство с заданным значением, но в обратном порядке.

const getLast = Phaser.Utils.Array.GetFirst(array, property, value, -1);
console.log(getLast); // Выведет { name: 'Dave', visible: false }

В нашем массиве последний объект с visible: false — это Dave. Метод возвращает его, игнорируя предыдущие совпадения (Bob). Это удобно, когда вам нужен самый поздний объект в списке, например, последний неактивный элемент для удаления из памяти.

Практическое применение в играх

В реальной разработке игр на Phaser эти методы могут значительно упростить управление группами объектов. Рассмотрим типичные случаи:

- **Управление пулами объектов**: Если у вас есть пул снарядов, вы можете найти первый неактивный снаряд для его повторного использования. - **Фильтрация спрайтов**: Например, найти последний спрайт, который вышел за границы экрана, чтобы удалить его. - **Обработка состояний**: Поиск первого игрока в состоянии 'hurt' для применения лечебного эффекта.

// Пример: поиск первого неактивного снаряда в пуле
const bullets = this.bullets.getChildren();
const inactiveBullet = Phaser.Utils.Array.GetFirst(bullets, 'active', false, 0);
if (inactiveBullet) {
    inactiveBullet.active = true;
    inactiveBullet.setPosition(x, y);
}

Этот код избегает цикла по всем снарядам, что может быть эффективнее при большом количестве объектов.

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

Методы GetFirst и GetLast из Phaser.Utils.Array — это мощные инструменты для поиска объектов в массивах по свойствам. Они сокращают код, улучшают читаемость и могут оптимизировать производительность в игровых сценах. Для экспериментов попробуйте использовать эти методы с другими свойствами объектов, например, alpha, scale или health. Также можно комбинировать их с другими утилитами Phaser, например, GetRandom для выбора случайного объекта из найденных. Исследуйте, как они работают с большими массивами спрайтов в динамических сценах.