Phaser - полезные советы

Часть 22: Все что надо знать о классе Group в Phaser

Написать игру не использовав Phaser.Group невозможно. Но перед тем как вы решили им воспользоваться, важно знать его возможности и особенности. Изначально я воспринимал Phaser.Group как div блок в HTML, который не только хранит в себе элементы, но сам является физическим объектом.

На самом деле, Group это структура данных, список элементов над которыми можно одновременно проводить определенные действия. Порядковый номер элемента в таком списке тоже имеет свое значение, оно используется Phaser-ом что бы определить после какого элемента надо его отрисовать на сцене. Но при этом у массива ведь нет координат, высоты или ширины, вот так и с группой.

Но есть некоторые условности. К примеру x и y координатой группы принято считать x, y координаты элемента из списка, который находиться в самом левом верхнем углу. А вот за ширину отвечает расстояние между самым левым верхним и самым правым нижним элементом.

Есть ряд особенностей которые надо помнить. Как например: один элемент может находиться одновременно только в одной группе. Добавив существующий элемент в другую группу, он сам автоматом себя удалить из старой, вне зависимо от того, хотите вы это или нет.

По этой причине будьте осторожны с переборами типа forEach(). Если вы во время очередной итерации переместите или удалите элемент группы, то цикл собъется. Тут срабатывает и принцип JavaScript-а. Ведь группа это сложная структура и всегда передаётся функции по ссылке. А значит, Н-ый элемент берется из списка прямо перед каждой итерацией цикла, а если мы удалили объект, в предыдущей итерации, значит это уже не Н-ный а (Н-1)-ный объект. В РНР к примеру, массив копируется перед foreach и итерация проходит над копией, по этому изменение оригинального массива, ни как не влияет на его работу.

Полезно знать, что при получении координат методом getBounds() можно передать объект, относительно которого и будут рассчитаны координаты x и y. На width и height данный параметр не влияет. Это очень удобно в случаях, когда элемент интерфейса перемешен anchor-ом и стандартный getBounds() будет возвращать его оригинальное расположение. Если же мы сделаем getBounds(game.world), то получим его координаты относительно самой сцены, вне зависимости от трансформаций произведенных над объектом. Также я заметил, что иногда высота группы определяется не верно, если не передать game.world параметром getBounds() методу. Причину пока не определил.

Запомните, при выравнивании элементов группы методом aling(), они автоматом будут упорядочены относительно начала координатной системы (точки 0х0). Что бы решить данную проблему, сохранените исходные координаты группы перед align() и после добавьте отступы каждому элементу группы (или сдвиньте всю группу):

group.addAll('x', bounds.x)
group.addAll('y', bounds.y)

Если у вас есть вопросы или пожелания, я всегда рад вашим комментариям.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *