О чем этот пример
При разработке игр часто приходится работать с массивами игровых объектов, спрайтов или данных. Чтобы быстро найти нужный элемент по его свойствам, 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 для выбора случайного объекта из найденных. Исследуйте, как они работают с большими массивами спрайтов в динамических сценах.
