Класс: Phaser.Physics.Ninja
Конструктор
new Ninja(game)
Физика Ninja. Система физики Ninja была создана в Flash компанией Metanet Software и портирована на JavaScript Ричардом Дейви.
Она позволяет производить столкновения AABB и Circle с Tile. Плитки могут быть любого из 34 различных типов, включая наклоны, выпуклые и вогнутые фигуры.
Она выполняет свою задачу очень хорошо, но нуждается в расширении и оптимизации. Вот некоторые функции, которые я хотел бы видеть добавленными сообществом:
- Столкновение AABB с AABB
- Столкновение AABB с Circle
- Поддержка свойств «неподвижный» для AABB и Circle
- Столкновение n-способов, так что AABB/Circle может проходить через плитку снизу и приземляться на неё.
- QuadTree или пространственная сетка для более быстрого поиска Body vs. Tile Group.
- Оптимизация внутренней векторной математики и сокращение количества создаваемых временных переменных.
- Расширение Gravity и Bounce, чтобы разрешить отдельные значения для осей x/y.
- Поддержка тел, связанных со спрайтами, у которых якорь не установлен в 0.5
Не стесняйтесь пытаться реализовать любое из вышеперечисленного и отправлять Pull Request со своим кодом! Не забудьте включить тестовые примеры, доказывающие их работоспособность.
Параметры
| Имя | Тип | Описание |
|---|---|---|
game | Phaser.Game | ссылка на текущую инстанцию игры. |
- Исходный код: physics/ninja/World.js (Строка 29)
Классы
- AABB
- Body
- Circle
- Tile
Публичные свойства
- Исходный код: physics/ninja/World.js (Строка 49)
- Исходный код: physics/ninja/World.js (Строка 34)
- Исходный код: physics/ninja/World.js (Строка 44)
- Исходный код: physics/ninja/World.js (Строка 59)
- Исходный код: physics/ninja/World.js (Строка 54)
- Исходный код: physics/ninja/World.js (Строка 64)
- Исходный код: physics/ninja/World.js (Строка 39)
bounds : Phaser.Rectangle
Границы, в пределах которых существует физический мир. По умолчанию совпадают с границами мира.
game : Phaser.Game
Локальная ссылка на игру.
gravity : number
Настройка гравитации мира.
maxLevels : number
Используется QuadTree для установки максимального уровня итераций.
maxObjects : number
Используется QuadTree для установки максимального количества объектов в каждом квадранте.
quadTree : Phaser.QuadTree
QuadTree мира.
time : Phaser.Time
Локальная ссылка на game.time.
Публичные методы
- Source code: physics/ninja/World.js (Line 224)
- Source code: physics/ninja/World.js (Line 330)
- Source code: physics/ninja/World.js (Line 246)
- Source code: physics/ninja/World.js (Line 121)
clearTilemapLayerBodies(map, layer)
Очищает все физические тела из заданного TilemapLayer, которые были созданы с помощью World.convertTilemap.
Parameters
| Name | Type | Argument | Description |
|---|---|---|---|
map | Phaser.Tilemap | Tilemap для получения данных карты. | |
layer | number | string | Phaser.TilemapLayer | <optional> | Слой для обработки. Если не указан, используется map.currentLayer. |
collide(object1, object2, collideCallback, processCallback, callbackContext) → {boolean}
Проверяет столкновение между двумя игровыми объектами. Вы можете выполнить столкновения: Sprite vs. Sprite, Sprite vs. Group, Group vs. Group, Sprite vs. Tilemap Layer или Group vs. Tilemap Layer.
Второй параметр может быть массивом объектов разных типов.
Объекты также автоматически разделяются. Если разделение не требуется, используйте ArcadePhysics.overlap.
Можно указать необязательный параметр processCallback. Если он задан, эта функция будет вызвана при обнаружении столкновения между двумя спрайтами. Она вызывается до любого разделения,
давая вам возможность выполнить дополнительные проверки. Если функция возвращает true, то выполняется столкновение и разделение. Если false — пропускается.
collideCallback — необязательная функция, которая вызывается только если объекты столкнулись. Если установлен processCallback, он должен вернуть true, чтобы вызвать collideCallback.
Parameters
| Name | Type | Argument | Default | Description |
|---|---|---|---|---|
object1 | Phaser.Sprite | Phaser.Group | Phaser.Particles.Emitter | Phaser.TilemapLayer | Первый объект для проверки. Может быть экземпляром Phaser.Sprite, Phaser.Group, Phaser.Particles.Emitter или Phaser.TilemapLayer. | ||
object2 | Phaser.Sprite | Phaser.Group | Phaser.Particles.Emitter | Phaser.TilemapLayer | array | Второй объект или массив объектов для проверки. Может быть Phaser.Sprite, Phaser.Group, Phaser.Particles.Emitter или Phaser.TilemapLayer. | ||
collideCallback | function | <optional> | null | Необязательная функция обратного вызова, которая вызывается при столкновении объектов. В эту функцию передаются два объекта в том же порядке, в котором вы их указали. |
processCallback | function | <optional> | null | Функция обратного вызова, которая позволяет выполнить дополнительные проверки объектов при перекрытии. Если она установлена, столкновение произойдёт только если processCallback вернёт true. Два объекта будут переданы в эту функцию в том же порядке, в котором вы их указали. |
callbackContext | object | <optional> | Контекст, в котором будут выполняться обратные вызовы. |
Returns
True, если произошло столкновение, иначе false.
convertTilemap(map, layer, slopeMap) → {array}
Проходит по всем тайлам в заданном Tilemap и TilemapLayer и преобразует тайлы, установленные на столкновение, в физические тайлы.
Вызывайте эту функцию *после* указания всех тайлов, с которыми вы хотите столкнуться, с помощью функций вроде Tilemap.setCollisionBetween и т.д.
Каждый раз при вызове этого метода любые ранее созданные тела будут уничтожены и удалены из мира.
Понимайте, что это очень ресурсоёмкая операция и её не следует выполнять в основном цикле игры.
В Ninja тайлы имеют ID от 0 до 33, где 0 — 'пустой', 1 — полный тайл, 2 — наклон под 45 градусов и т.д. Список ID
можно найти в самом конце Tile.js, или в удобной визуальной справке в папке resources/Ninja Physics Debug Tiles в репозитории.
Параметр slopeMap — массив, который управляет тем, как индексы тайлов в данных вашей карты будут сопоставлены с ID тайлов Ninja.
Например, если у вас 6 тайлов в наборе: Представьте, что первые 4 должны быть преобразованы в полностью твёрдые тайлы, а остальные 2 — в тайлы со скосом под 45 градусов.
Ваш массив slopeMap будет выглядеть так: [ 1, 1, 1, 1, 2, 3 ].
Где каждый элемент массива — тайл в вашей карте, и получившийся тайл Ninja, который он должен создать.
Parameters
| Name | Type | Description |
|---|---|---|
map | Phaser.Tilemap | Tilemap для получения данных карты. |
layer | number | string | Phaser.TilemapLayer | Слой для обработки. Если не указан, используется map.currentLayer. |
slopeMap | object | Карта соответствия индекса тайла ID тайла. |
Returns
Массив объектов Phaser.Physics.Ninja.Tile, которые были созданы.
enable(object, type, id, radius, children)
Создаёт физическое тело Ninja для данного игрового объекта или массива объектов.
Игровой объект может иметь только 1 активное физическое тело одновременно, и оно не может быть изменено до тех пор, пока объект не будет уничтожен.
Parameters
| Name | Type | Argument | Default | Description |
|---|---|---|---|---|
object | object | array | Phaser.Group | Игровой объект, для которого создаётся физическое тело. Также может быть массивом или группой объектов, физическое тело будет создано для каждого потомка, у которого есть свойство | ||
type | number | <optional> | 1 | Тип формы Ninja для создания. 1 = AABB, 2 = Circle или 3 = Tile. |
id | number | <optional> | 1 | Если это тело типа Tile, здесь можно установить ID тайла, например, Phaser.Physics.Ninja.Tile.SLOPE_45DEGpn, Phaser.Physics.Ninja.Tile.CONVEXpp и т.д. |
radius | number | <optional> | 0 | Если это тело типа Circle, это значение определяет радиус. |
children | boolean | <optional> | true | Создавать ли тело для всех потомков этого объекта? Если true, произойдёт рекурсивный спуск по списку отображения до тех пор, пока это возможно. |
enableAABB(object, children)
- Исходный код: physics/ninja/World.js (Строка 75)
- Исходный код: physics/ninja/World.js (Строка 181)
- Исходный код: physics/ninja/World.js (Строка 89)
- Исходный код: physics/ninja/World.js (Строка 104)
- Исходный код: physics/ninja/World.js (Строка 291)
Это создаст физическое тело Ninja Physics AABB на заданном объекте игры. Его размеры будут соответствовать ширине и высоте объекта в момент его создания.
Объект игры может иметь только 1 активное физическое тело в любой момент времени, и его нельзя изменить до тех пор, пока объект не будет уничтожен.
Параметры
| Имя | Тип | Аргумент | Значение по умолчанию | Описание |
|---|---|---|---|---|
object | объект | массив | Phaser.Group | Объект игры, на котором нужно создать физическое тело. Также может быть массивом или группой объектов; тело будет создано на каждом дочернем объекте, имеющем свойство | ||
children | логическое значение | <необязательно> | true | Создавать ли тело на всех дочерних объектах этого объекта? Если true, то будет рекурсивно проверяться структура отображения до тех пор, пока это возможно. |
enableBody(object)
Создаёт физическое тело Ninja Physics на заданном объекте игры.
Объект игры может иметь только 1 активное физическое тело в любой момент времени, и его нельзя изменить до тех пор, пока тело не будет сброшено.
Параметры
| Имя | Тип | Описание |
|---|---|---|
object | объект | Объект игры, на котором нужно создать физическое тело. Тело будет создано только если у этого объекта есть свойство |
enableCircle(object, radius, children)
Создаст физическое тело Ninja Physics типа круг на заданном объекте игры.
Объект игры может иметь только 1 активное физическое тело в любой момент времени, и его нельзя изменить до тех пор, пока объект не будет уничтожен.
Параметры
| Имя | Тип | Аргумент | Значение по умолчанию | Описание |
|---|---|---|---|---|
object | объект | массив | Phaser.Group | Объект игры, на котором нужно создать физическое тело. Также может быть массивом или группой объектов; тело будет создано на каждом дочернем объекте, имеющем свойство | ||
radius | число | Радиус круга. | ||
children | логическое значение | <необязательно> | true | Создавать ли тело на всех дочерних объектах этого объекта? Если true, то будет рекурсивно проверяться структура отображения до тех пор, пока это возможно. |
enableTile(object, id, children)
Создаст физическое тело Ninja Physics типа плитка на заданном объекте игры. Существует 34 различных типа плиток, включая наклонные под 45 градусов,
выпуклые и вогнутые круги и многое другое. Параметр id управляет типом создаваемой плитки, но вы также можете изменить его во время выполнения.
Обратите внимание, что для всех плиток, основанных на углах, ширина и высота должны быть равными. Если заданный объект не имеет равной ширины и высоты, будет использоваться ширина.
Объект игры может иметь только 1 активное физическое тело в любой момент времени, и его нельзя изменить до тех пор, пока объект не будет уничтожен.
Параметры
| Имя | Тип | Аргумент | Значение по умолчанию | Описание |
|---|---|---|---|---|
object | объект | массив | Phaser.Group | Объект игры, на котором нужно создать физическое тело. Также может быть массивом или группой объектов; тело будет создано на каждом дочернем объекте, имеющем свойство | ||
id | число | <необязательно> | 1 | Тип плитки, например, Phaser.Physics.Ninja.Tile.SLOPE_45DEGpn, Phaser.Physics.Ninja.Tile.CONVEXpp и т.д. |
children | логическое значение | <необязательно> | true | Создавать ли тело на всех дочерних объектах этого объекта? Если true, то будет рекурсивно проверяться структура отображения до тех пор, пока это возможно. |
overlap(object1, object2, overlapCallback, processCallback, callbackContext) → {boolean}
Проверяет перекрытие между двумя объектами игры. Объектами могут быть Sprites, группы или излучатели.
Вы можете выполнить проверки перекрытия Sprite vs. Sprite, Sprite vs. Group и Group vs. Group.
В отличие от collide, объекты НЕ автоматически разделяются или на них не накладывается никакая физика; они просто проверяются на перекрытие.
Второй параметр может быть массивом объектов разных типов.
Параметры
| Имя | Тип | Аргумент | Значение по умолчанию | Описание |
|---|---|---|---|---|
object1 | Phaser.Sprite | Phaser.Group | Phaser.Particles.Emitter | Первый объект для проверки. Может быть экземпляром Phaser.Sprite, Phaser.Group или Phaser.Particles.Emitter. | ||
object2 | Phaser.Sprite | Phaser.Group | Phaser.Particles.Emitter | массив | Второй объект или массив объектов для проверки. Может быть Phaser.Sprite, Phaser.Group или Phaser.Particles.Emitter. | ||
overlapCallback | функция | <необязательно> | null | Необязательная функция обратного вызова, которая вызывается, если объекты перекрываются. Два объекта будут переданы в эту функцию в том же порядке, в котором вы их указали. |
processCallback | функция | <необязательно> | null | Функция обратного вызова, которая позволяет выполнить дополнительные проверки двух объектов, если они перекрываются. Если это установлено, то overlapCallback будет вызван только в том случае, если processCallback вернёт true. |
callbackContext | объект | <необязательно> | Контекст, в котором следует выполнять обратные вызовы. |
Возвращает
True, если произошло перекрытие, в противном случае false.
separate(body1, body2) → {boolean}
Основная функция разделения для разделения двух физических тел.
Параметры
| Имя | Тип | Описание |
|---|---|---|
body1 | Phaser.Physics.Ninja.Body | Объект Body для разделения. |
body2 | Phaser.Physics.Ninja.Body | Объект Body для разделения. |
Возвращает
- Исходный код: physics/ninja/World.js (Строка 567)
- Исходный код: physics/ninja/World.js (Строка 198)
- Исходный код: physics/ninja/World.js (Строка 213)
Возвращает true, если тела столкнулись, иначе false.
setBounds(x, y, width, height)
Обновляет размер этого физического мира.
Параметры
| Имя | Тип | Описание |
|---|---|---|
x | number | Точка верхнего левого угла мира. |
y | number | Точка верхнего левого угла мира. |
width | number | Новая ширина мира. Никогда не может быть меньше Game.width. |
height | number | Новая высота мира. Никогда не может быть меньше Game.height. |
setBoundsToWorld()
Обновляет размер этого физического мира, чтобы он соответствовал размеру игрового мира.
© 2016 Richard Davey, Photon Storm Ltd.
Licensed under the MIT License.
http://phaser.io/docs/2.6.2/Phaser.Physics.Ninja.html