Моделирование физики
Моделирование физики в Наборе Sprite выполняется путем добавления организаций физики к сценам. Организация физики является моделируемым физическим объектом, подключенным к узлу в дереве узла сцены. Это использует позицию узла и ориентацию для размещения в моделирование. Каждая организация физики имеет другие характеристики, определяющие, как моделирование воздействует на нее. Они включают врожденные свойства физического объекта, такие как его масса и плотность, и также свойства, наложенные на него, такие как его скорость. Эти характеристики определяют, как организация перемещается, как она затронута силами на моделировании, и как она реагирует на коллизии с другими организациями физики.
Каждый раз, когда сцена вычисляет новый кадр анимации, она моделирует эффекты сил и коллизий на организациях физики, подключенных к дереву узла. Это вычисляет заключительную позицию, ориентацию и скорость для каждой организации физики. Затем сцена обновляет позицию и вращение каждого соответствующего узла.
Для использования физики в игре Вы должны:
Организации физики присоединения к узлам в дереве узла. Посмотрите, что Вся Физика Моделируется на Организациях Физики.
Сконфигурируйте физические свойства организаций физики. Посмотрите Конфигурирование Физических Свойств Организации Физики.
Определите глобальные характеристики моделирования физики сцены, такие как сила тяжести. Посмотрите Конфигурирование Мира Физики.
Где необходимо для поддержки геймплея установите скорость организаций физики в сцене или примените силы или импульсы им. Посмотрите Перемещение Организаций Физики Создания и Добавление Полей Физики к Вашей Сцене.
Определите, как организации физики в сцене взаимодействуют, когда они вступают в контакт друг с другом. Посмотрите Работу с Коллизиями и Контактами.
Оптимизируйте свое моделирование физики для ограничения числа вычислений, которые это должно выполнить. Посмотрите Подсказки и Приемы для Использования Физики в Вашей Игре.
Набор Sprite использует Международную систему единиц, также известную как SI или килограмм метра вторая система. Где необходимо, Вы, возможно, должны консультироваться с другими ссылочными материалами онлайн для узнавания больше об уравнениях физики, используемых Набором Sprite.
Вся Физика Моделируется на Организациях Физики
SKPhysicsBody
объект определяет форму и параметры моделирования для организации физики в системе. Когда сцена моделирует физику, она выполняет вычисления для всех организаций физики, подключенных к дереву сцены. Так, Вы создаете SKPhysicsBody
возразите, сконфигурируйте его свойства, и затем присвойте его узлу physicsBody
свойство.
Существует три вида организаций физики:
Динамический том моделирует физический объект с объемом и массой, которая может быть затронута силами и коллизиями в системе. Используйте динамические тома для представления элементов в сцене, которая должна переместиться и столкнуться друг с другом.
Статический объем подобен динамическому тому, но его скорость проигнорирована, и это незатронуто силами или коллизиями. Однако, потому что это все еще имеет объем, другие объекты могут возвратиться от него или взаимодействовать с ним. Используйте статические объемы для представления элементов, занимающих место в сцене, но это не должно быть перемещено моделированием. Например, Вы могли бы использовать статические объемы для представления стен лабиринта.
В то время как полезно думать о статических и динамических томах как об отличных объектах, на практике это два различных режима, можно примениться к любой основанной на объеме организации физики. Это может быть полезно, потому что можно выборочно включить или отключить эффекты для организации.
Край является статической организацией объема меньше. Края никогда не перемещаются моделированием, и их масса не имеет значения. Края используются для представления отрицательного пространства в сцене (такой как полый спот в другом объекте) или uncrossable, невидимо тонкая граница. Например, края часто используются для представления границ сцены.
Основное различие между краем и объемом - то, что край разрешает перемещение в своих собственных границах, в то время как объем считают существенным объектом. Если края перемещены через другие средние значения, они только взаимодействуют с объемами, не с другими краями.
Набор Sprite обеспечивает несколько стандартных форм, а также формирует на основе произвольных путей. Рисунок 6-1 показывает доступные формы.
Используйте форму физики, соответствующую графическое представление
В большинстве случаев организация физики должна иметь размер и форму, близко приближающую визуальное представление соответствующего узла. Например, на рисунке 6-2, ракета имеет узкую форму, не хорошо представленную или кругом или прямоугольником. Выпуклая форма многоугольника выбрана и адаптирована для соответствия иллюстраций спрайта.
Если Вы не хотите создавать свои собственные формы, можно использовать Набор Sprite для создания формы для Вас на основе текстуры спрайта.
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; |
sprite.physicsBody = [SKPhysicsBody bodyWithTexture:sprite.texture size:sprite.texture.size]; |
При выборе формы для организации физики не будьте чрезмерно точны. Более сложные формы требуют, чтобы было должным образом моделировано больше работы. Для основанных на объеме организаций используйте следующие инструкции:
Круг является самой эффективной формой.
Находящийся на пути многоугольник является наименее эффективной формой и вычислительными масштабами работы со сложностью многоугольника.
Основанная на крае организация является более дорогой для вычислений, чем основанная на объеме организация. Это вызвано тем, что организации, с которыми это взаимодействует, могут потенциально быть по обе стороны от открытого края или на внутренней или внешней части закрытой формы. Используйте эти инструкции:
Строки и прямоугольники являются самыми эффективными основанными на крае организациями.
Граничные циклы и граничные цепочки являются самыми дорогими основанными на крае организациями и вычислительными масштабами работы со сложностью пути.
Создание организаций физики
Организация физики создается путем вызова одного из SKPhysicsBody
методы класса. Каждый метод класса определяет, создается ли основанная на объеме или основанная на крае организация и что формирует его, имеет.
Создание граничного цикла вокруг сцены
Перечисление 6-1 показывает код, часто использующийся в играх, которые не должны прокручивать содержание. В этом случае игра хочет организации физики, поражающие границы сцены, чтобы прийти в норму в область геймплея.
Перечисление 6-1 граница сцены
- (void) createSceneContents |
{ |
self.backgroundColor = [SKColor blackColor]; |
self.scaleMode = SKSceneScaleModeAspectFit; |
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; |
} |
Создание кругового объема для Sprite
Перечисление 6-2 показывает код, создающий организацию физики для сферического или кругового объекта. Поскольку организация физики присоединена к объекту спрайта, ей обычно нужен объем. В этом случае изображение спрайта, как предполагается, близко приближает круг, центрируемый на точке привязки, таким образом, радиус круга вычисляется и используется для создания организации физики.
Перечисление 6-2 организация физики для кругового спрайта
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"sphere.png"]; |
sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2]; |
sprite.physicsBody.dynamic = YES; |
Если бы организация физики была значительно меньшей, чем изображение спрайта, то данные, используемые для создания организации физики, возможно, должны были бы быть предоставлены некоторым другим источником, таким как список свойств. Посмотрите Методы наиболее успешной практики Набора Sprite.
Конфигурирование физических свойств организации физики
SKPhysicsBody
класс определяет свойства, определяющие, как моделируется организация физики. Эти свойства влияют, как организация реагирует на силы, что вызывает ее, генерирует на себе (для моделирования трения), и как она реагирует на коллизии в сцене. В большинстве случаев свойства используются для моделирования физических эффектов.
Каждая отдельная организация также имеет свои собственные значения свойств, определяющие точно, как она реагирует на силы и коллизии в сцене. Вот самые важные свойства:
mass
свойство определяет, как силы влияют на организацию, а также сколько импульса организация имеет, когда это вовлечено в коллизию.friction
свойство определяет шероховатость поверхности организации. Это используется для вычисления силы трения, что организация применяется к другим организациям, проходящим ее поверхность.linearDamping
иangularDamping
свойства используются для вычисления трения на организацию, когда это перемещается через мир. Например, это могло бы использоваться для моделирования воздуха или водного трения.restitution
свойство определяет, сколько энергии организация поддерживает во время коллизии — ее пружинистость.
Другие свойства используются, чтобы определить, как моделирование выполняется на самой организации:
dynamic
свойство определяет, моделируется ли организация подсистемой физики.affectedByGravity
свойство определяет, проявляет ли моделирование силу тяготения на организации. Для получения дополнительной информации о мире физики посмотрите Конфигурирование Мира Физики.allowsRotation
свойство определяет, могут ли силы передать угловую скорость на организации.
Масса определяет сопротивление организации ускорению
Необходимо установить массу на каждой основанной на объеме организации в сцене так, чтобы это должным образом реагировало на силы, применился к нему.
Организация физики mass
, area
, и density
свойства все взаимосвязаны. При первом создании организации область организации вычисляется, и никогда не изменяется впоследствии. Другие два свойства изменяют значения одновременно, на основе следующей формулы:
mass = density x area
При конфигурировании организации физики у Вас есть две опции:
Установите
mass
свойство организации.density
свойство тогда автоматически повторно вычисляется. Когда Вы хотите точно управлять массой каждой организации, этот подход является самым полезным.Установите
density
свойство организации.mass
свойство тогда автоматически повторно вычисляется. Когда у Вас есть набор подобных организаций, создаваемых с различными размерами, этот подход является самым полезным. Например, если бы Ваши организации физики использовались для моделирования астероидов, то Вы могли бы дать всем астероидам ту же плотность, и затем установить надлежащий многоугольник ограничения для каждого. Каждая организация автоматически вычисляет надлежащую массу на основе своего размера на экране.
Когда скорректировать свойства организации
Чаще всего Вы конфигурируете организацию физики один раз и затем никогда не изменяете ее. Например, масса организации вряд ли изменится во время игры. Однако Вы не ограничиваетесь в выполнении так. В то время как моделирование выполняется, некоторые виды игр могут потребовать возможности скорректировать свойства организации даже. Вот несколько примеров того, когда Вы могли бы сделать так:
На реалистическом моделировании ракеты ракета расходует топливо для применения тяги. Поскольку топливо израсходовано, масса изменений ракеты. Для реализации этого в Наборе Sprite Вы могли бы создать класс ракеты, включающий a
fuel
свойство. Когда ракета толкает, топливо сокращено, и масса соответствующей организации повторно вычисляется.Свойства затухания обычно на основе характеристик организации и носителя, он перемещается через. Например, вакуум не применяет демпфирующих сил, и вода применяет больше демпфирующих сил, чем воздух. Если Ваша игра моделирует многократные среды, и организации могут переместиться между теми средами, Ваша игра может обновить свойства затухания организации каждый раз, когда это вводит новую среду.
Как правило, Вы вносите эти изменения как часть сцены пред - и последующая обработка. Посмотрите, что Усовершенствованная Сцена Обрабатывает.
Конфигурирование мира физики
Все организации физики в сцене являются частью мира физики, представленного в Наборе Sprite SKPhysicsWorld
объект, присоединенный к сцене. Мир физики определяет две важных характеристики моделирования:
gravity
свойство применяет ускорение к основанным на объеме организациям на моделировании. Статические объемы и организации физики, установившиеaffectedByGravity
свойство кNO
незатронуты.speed
свойство устанавливает курс, на котором работает моделирование.
Создание организаций физики переместиться
По умолчанию только сила тяжести применяется к организациям физики в сцене. В некоторых случаях этого могло бы быть достаточно для создания игры. Но в большинстве случаев, необходимо предпринять другие шаги для изменения скорости организаций физики.
Во-первых, можно управлять скоростью организации физики непосредственно путем установки velocity
и angularVelocity
свойства. Как со многими другими свойствами, Вы часто устанавливаете эти свойства один раз, когда организация физики сначала создается, и затем позвольте моделированию физики скорректировать их по мере необходимости. Например, примите на мгновение, что Вы делаете основанную на пространстве игру, где ракета может запустить ракеты. Когда поставка запускает ракету, ракета должна иметь стартовую скорость поставки плюс дополнительный вектор в направлении запуска. Перечисление 6-3 показывает одну реализацию для вычисления скорости запуска.
Перечисление 6-3 , Вычисляющее начальную скорость ракеты
missile.physicsBody.velocity = self.physicsBody.velocity; |
[missile.physicsBody applyImpulse: CGVectorMake(missileLaunchImpulse*cosf(shipDirection), |
missileLaunchImpulse*sinf(shipDirection))]; |
То, когда организация находится на моделировании, скорости более свойственно быть скорректированным на основе сил, применилось к организации. Другой источник скоростных изменений, коллизий, обсужден позже.
Набор по умолчанию сил, применяющихся к организации, включает:
Сила тяготения, примененная миром физики
Демпфирующие силы, примененные собственными свойствами организации
Сила трения на основе контакта с другой организацией в системе
Можно также применить собственные силы и импульсы к организациям физики. Чаще всего Вы применяете силы и импульсы на шаге предварительной обработки, прежде чем выполнится моделирование. Ваша игровая логика ответственна за определение, вынуждающее потребность быть примененной и за то, что сделала надлежащие вызовы метода для применения тех сил.
Можно принять решение применить или силу или импульс:
Сила применяется в течение отрезка времени на основе суммы времени моделирования, передающего между тем, когда Вы применяете силу и когда обрабатывается следующий кадр моделирования. Так, для применения непрерывной силы к организации необходимо сделать надлежащие вызовы метода каждым разом, когда новый кадр обрабатывается. Силы обычно используются для непрерывных эффектов
Импульс вносит мгновенное изменение в скорость организации, которая независима от суммы передавшего времени моделирования. Импульсы обычно используются для непосредственных изменений в скорости организации.
Чтобы продолжить пример ракеты, ракета, вероятно, применяет силу к себе, когда это включает свои механизмы. Однако, когда это запускает ракету, это могло бы запустить ракету с собственной скоростью ракеты и затем применить единственный импульс к нему, чтобы дать ему начальный пакет скорости.
Поскольку силы и импульсы моделируют то же понятие — корректировку скорости организации — остаток от этого раздела внимание на силы.
Можно применить силу к организации одним из трех способов:
Линейная сила, только влияющая на линейную скорость организации.
Вращающий момент, только влияющий на угловую скорость организации.
Сила применилась к точке на организации. Моделирование физики вычисляет отдельные изменения в угловой и линейной скорости организации, на основе формы объекта и точки, где была применена сила.
Перечисление 6-4 показывает код, который Вы могли реализовать в подклассе спрайта для применения силы к поставке. Когда основные механизмы активируются, эта сила ускоряет ракету. Поскольку механизмы скрываются за ракетой, силе применяются к линейно к организации ракеты. Код вычисляет вектор тяги на основе текущей ориентации ракеты. Ориентация основывается zRotation
свойство соответствующего узла, но ориентация иллюстраций может отличаться от ориентации узла. Тяга должна всегда ориентироваться с иллюстрациями. См. Рисование Вашего Содержания.
Перечисление 6-4 , Применяющее ракету, втискивают
static const CGFloat thrust = 0.12; |
CGFloat shipDirection = [self shipDirection]; |
CGVector thrustVector = CGVectorMake(thrust*cosf(shipDirection), |
thrust*sinf(shipDirection)); |
[self.physicsBody applyForce:thrustVector]; |
Перечисление 6-5 показывает подобный эффект, но на сей раз ракета поворачивается на силу, таким образом, тяга применяется как угловая тяга.
Перечисление 6-5 , Применяющее боковую тягу
[self.physicsBody applyTorque:thrust]; |
Работа с коллизиями и контактами
Рано или поздно две организации собираются попытаться занять то же место. Вам решать, чтобы решить, как отвечает Ваша игра. Набор Sprite использует два вида взаимодействий между организациями физики:
Контакт используется, когда необходимо знать, что две организации касаются друг друга. В большинстве случаев Вы используете контакты, когда необходимо внести изменения геймплея, когда происходит коллизия.
Коллизия используется для препятствования двум объектам взаимно проникнуть друг друга. Когда одна организация ударяет другую организацию, Набор Sprite автоматически вычисляет результаты коллизии и применяет импульс к организациям в коллизии.
Ваша игра конфигурирует организации физики в сцене для определения, когда коллизии должны произойти и когда взаимодействия между организациями физики требуют, чтобы была выполнена дополнительная игровая логика. Ограничение этих взаимодействий не только важно для определения логики Вашей игры, это также необходимо для получения хорошей производительности от Набора Sprite. Набор Sprite использует два механизма для ограничения числа взаимодействий в каждом кадре:
Основанные на крае организации физики никогда не взаимодействуют с другими основанными на крае организациями. Это означает, что, даже если Вы двигаете основанными на крае телами, меняя местоположение узлов, организации физики никогда не сталкиваются или связываются друг с другом.
Каждая организация физики категоризирована. Категории определяются Вашим приложением; каждая сцена может иметь до 32 категорий. При конфигурировании организации физики Вы определяете, каким категориям она принадлежит и с какими категориями организаций она хочет взаимодействовать. Контакты и коллизии указаны отдельно.
Коллизия и пример контакта: ракеты в пространстве
Систему контактов и коллизии проще понять путем исследования примера. В этом примере сцена используется для реализации игры пространства. Две ракеты дерутся на дуэли по части космоса. Эта область пространства имеет планеты и астероиды, с которыми могут столкнуться поставки. Наконец, потому что это - поединок, обе ракеты вооружены ракетами, они могут выстрелить друг в друга. Это простое описание определяет грубый геймплей для примера. Но реализация этого примера требует более точного выражения того, какие организации находятся в сцене и как они взаимодействуют друг с другом.
Из описания выше, Вы видите, что игра имеет четыре вида типов модуля, появляющихся в сцене:
Ракеты
Ракеты
Астероиды
Планеты
Небольшое количество типов модуля предполагает, что простой список категорий является хорошим проектом. Несмотря на то, что сцена ограничивается 32 категориями, для этого проекта только нужно четыре, один для каждого типа модуля. Каждая организация физики принадлежит одной и только одной категории. Так, ракета могла бы появиться как узел спрайта. Узел спрайта ракеты имеет связанную организацию физики, и та организация принадлежит ракетной категории. Другие узлы и организации физики определяются так же.
Учитывая те четыре категории, следующий шаг должен определить взаимодействия, разрешенные между этими организациями физики. Взаимодействия контакта обычно важны для занятия сначала, потому что их почти всегда диктует логика геймплея. Во многих случаях, если контакт обнаруживается, Вам нужна коллизия, которая будет вычислена также. Когда контакт приводит к одной из двух организаций физики, удаляемых из сцены, это наиболее распространено.
Таблица 6-1 описывает взаимодействия контакта для игры ракет.
Ракета | Ракета | Астероид | Планета | |
---|---|---|---|---|
Ракета | Нет | Да | Да | Да |
Ракета | Нет | Да | Да | Да |
Астероид | Нет | Нет | Нет | Да |
Планета | Нет | Нет | Нет | Нет |
Все эти взаимодействия основываются на игровой логике. Т.е. когда любой из этих контактов происходит, игра должна быть уведомлена так, чтобы она могла обновить игровое состояние. Вот что потребности произойти:
Ракета взрывается, когда она ударяет поставку, астероид или планету. Если ракетные удары поставка, поставка наносит ущерб.
Поставка, связывающаяся с поставкой, астероидом или планетой, наносит ущерб.
Уничтожается астероид, связывающийся с планетой.
Не необходимо для этих взаимодействий быть симметричным, потому что Набор Sprite только вызывает Вашего делегата один раз на кадр для каждого контакта. Любая организация может указать, что интересуется контактом. Поскольку ракета уже запрашивает сообщение контакта, когда она ударяет поставку, поставка не должна просить то же сообщение контакта.
Когда коллизии должны быть вычислены сценой, следующий шаг определяет. Каждая организация описывает, какие виды организаций в сцене могут столкнуться с нею. Таблица 6-2 описывает список разрешенных коллизий.
Ракета | Ракета | Астероид | Планета | |
---|---|---|---|---|
Ракета | Нет | Нет | Нет | Нет |
Ракета | Нет | Да | Да | Да |
Астероид | Нет | Да | Да | Нет |
Планета | Нет | Нет | Нет | Да |
При работе с коллизиями каждая информация о коллизии организации физики важна. Когда две организации сталкиваются, это возможно только для одной организации к затронутому коллизией. Когда это происходит, только скорость затронутой организации обновляется.
В таблице сделаны следующие предположения:
Ракеты всегда уничтожаются в любых взаимодействиях с другими объектами, таким образом, ракета игнорирует все коллизии с другими организациями. Точно так же ракеты, как полагают, имеют слишком мало массы, чтобы двигать другими телами в коллизии. Несмотря на то, что игра могла принять решение иметь ракеты, сталкиваются с другими ракетами, игра выбирает не, к тому, потому что будет много суетящихся ракет. Поскольку каждая ракета, возможно, должна была бы быть протестирована против любой ракеты, эти взаимодействия потребуют большого количества дополнительных вычислений.
Поставка отслеживает коллизии с поставками, астероидами и планетами.
Астероид игнорирует планетарные коллизии, потому что описание геймплея для контактов утверждает, что астероид будет уничтоженным.
Планеты отслеживают только коллизии с другими планетами. Ничто иное не имеет достаточно массы для перемещения планеты, таким образом, игра игнорирует те коллизии и избегает потенциально дорогих вычислений.
Реализация примера ракеты в коде
При определении классификаций и взаимодействий необходимо реализовать их в коде игры. Классификации и взаимодействия каждый определяются 32-разрядной маской. Каждый раз, когда потенциальное взаимодействие происходит, маска категории каждой организации тестируется против контакта и масок коллизии другой организации. Набор Sprite выполняет эти тесты логически Выполнением операции «И» эти две маски вместе. Если результатом является ненулевое число, то то взаимодействие происходит.
Вот то, как Вы превратили бы пример ракеты в код Набора Sprite:
Определите значения маски категории:
Маска Категории перечисления 6-6 оценивает за поединок пространства
static const uint32_t missileCategory = 0x1 << 0;
static const uint32_t shipCategory = 0x1 << 1;
static const uint32_t asteroidCategory = 0x1 << 2;
static const uint32_t planetCategory = 0x1 << 3;
Когда организация физики будет инициализирована, установите
categoryBitMask
,collisionBitMask
, иcontactTestBitMask
свойства.Перечисление 6-7 показывает типичную реализацию для записи ракеты в Таблице 6-1 и Таблице 6-2.
Перечисление 6-7 , Присваивающее контакт и маски коллизии к ракете
SKSpriteNode *ship = [SKSpriteNode spriteNodeWithImageNamed:@"spaceship.png"];
ship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ship.size];
ship.physicsBody.categoryBitMask = shipCategory;
ship.physicsBody.collisionBitMask = shipCategory | asteroidCategory | planetCategory;
ship.physicsBody.contactTestBitMask = shipCategory | asteroidCategory | planetCategory;
Присвойте делегата контакта в мире физики сцены.
Часто, протокол делегата реализован сценой. Дело обстоит так в Перечислении 6-8.
Перечисление 6-8 , Добавляющее сцену как делегат контакта
-(id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
...
self.physicsWorld.gravity = CGVectorMake(0,0);
self.physicsWorld.contactDelegate = self;
...
}
return self;
}
Реализуйте метод делегата контакта добавить игровую логику.
Перечисление 6-9 частичная реализация делегата контакта
- (void)didBeginContact:(SKPhysicsContact *)contact
{
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if ((firstBody.categoryBitMask & missileCategory) != 0)
{
[self attack: secondBody.node withMissile:firstBody.node];
}
...
}
Этот пример показывает несколько важных понятий для рассмотрения при реализации делегата контакта:
Делегат передается
SKPhysicsContact
объект, объявляющий, какие организации были вовлечены в коллизию.Организации в контакте могут появиться в любом порядке. В коде Ракет сетки взаимодействия всегда указываются в сортированном порядке категорий. В этом случае, когда контакт происходит, код полагается на это для сортировки двух записей. Более простая альтернатива должна была бы проверить обе организации в контакт и отгрузку если любой соответствия запись маски.
Когда Ваша игра должна работать с контактами, необходимо определить результат на основе обеих организаций в коллизии. Полагайте, что изучение Двойного Образца Отгрузки и использование его сдают работу в аренду к другим объектам в системе. Встраивание всей логики в сцене может привести к долгим, сложным методам делегата контакта, которые трудно считать.
node
свойство может получить доступ к узлу, к которому присоединена организация физики. Используйте его для получения информации о доступе об узлах, участвующих в коллизии. Например, Вы могли бы использовать класс узла,name
свойство или данные, хранившие вuserData
словарь, чтобы определить, как должен быть обработан контакт.
Укажите коллизии высокой точности для маленьких или стремительных объектов
Когда Набор Sprite выполняет обнаружение коллизий, он сначала определяет расположения всех организаций физики в сцене. Тогда это определяет или коллизии, или контакты произошли. Этот вычислительный метод быстр, но может иногда приводить к пропущенным коллизиям. Небольшая организация могла бы переместиться настолько быстро, что она полностью проходит через другую организацию физики, никогда не имея кадра анимации, где эти два касаются друг друга.
Если у Вас есть организации физики, которые должны столкнуться, можно подсказать Набору Sprite для использования более точной модели коллизии для проверки на взаимодействия. Эта модель является более дорогой, таким образом, она должна использоваться экономно. Когда любая организация использует точные коллизии, с многократными позициями перемещения связываются и тестируют, чтобы гарантировать, что обнаруживаются все контакты.
ship.physicsBody.usesPreciseCollisionDetection = YES; |
Добавление полей физики к сцене
Возможно реализовать игру с помощью только организации физики, коллизии и приложенные силы, но иногда это может быть большой работой. Например, если бы Вы хотели, чтобы два объекта были притянуты друг другу, то необходимо было бы выполнить вычисления силы тяжести и применить те силы каждый раз, когда новый кадр вычисляется. Когда Вы хотите применить обобщенные эффекты к сцене, можно сделать эту более простую физику использования поля.
Поле физики является узлом, помещающимся в дереве узла Вашей сцены. Когда сцена моделирует физику, поле физики влияет на организации физики, сконфигурированные для взаимодействия с ним. Существует много различных видов полевых эффектов, все из которых определяются в Ссылке класса SKFieldNode.
Перечисление 6-10 показывает одно из этих полей, линейного поля силы тяжести. В этом примере полевой узел заменяет силу тяжести по умолчанию, предоставленную миром физики сцены. Во-первых, сила тяжести по умолчанию отключена. Затем сцена создает линейное поле силы тяжести с вектором, указывающим на нижнюю часть экрана, и дает узлу силу, равную силе тяжести Земли. Наконец, это добавляет узел к себе.
Перечисление 6-10 , Заменяющее силу тяжести по умолчанию полевым узлом силы тяжести
self.physicsWorld.gravity = CGVectorMake(0,0); |
vector_float3 gravityVector = {0,-1,0}; |
SKFieldNode *gravityNode = [SKFieldNode linearGravityFieldWithVector: gravityVector]; |
gravityNode.strength = 9.8; |
[self addChild:gravityNode]; |
Вот некоторые причины, Вы могли бы использовать полевой узел, а не силу тяжести по умолчанию:
Можно варьироваться сила и направление силы тяжести друг независимо от друга.
Вы можете даже сила поля с помощью действий.
Можно изменить направление силы тяжести путем вращения полевого узла.
gravityNode.zRotation = M_PI; // Flip gravity.
Можно включить и отключить силу тяжести с помощью полевого узла
enabled
свойство, не изменяя полевую силу узла или направление.
Ограничение эффекта полевых узлов через категории и области
По умолчанию полевой узел влияет на все организации физики в сцене. Однако это не должен быть этот путь. Путем тщательного управления, какие организации физики затронуты полевым узлом, можно создать некоторые интересные игровые эффекты.
Полевые узлы категоризированы точно так же, как организации физики. Точно так же организации физики объявляют, какие полевые категории влияют на них. Комбинируя эти два свойства, можно решить, какие виды полей реализованы игрой и какие организации физики затронуты каждым из тех полей. Как правило, Вы делаете это при помощи полевых категорий для определения общих впечатлений, что можно заскочить в игру. Например, предположите в настоящий момент реализацию примера Ракеты, и Вы хотите добавить силу тяжести к планете. Сила тяжести должна вытянуть поставки и астероиды к планете. Перечисление 6-11 создает одну категорию для эффектов силы тяжести и вторую категорию для экранов (используемый позже в этом разделе). Когда планета создается, отдельный радиальный полевой узел силы тяжести добавляется как дочерний элемент и сконфигурирован для использования категории силы тяжести. Каждый раз, когда новая организация физики создается, маска организации сконфигурирована для определения, какие поля должны влиять на него. Поставки затронуты силой тяжести, и ракеты затронуты силовыми полями.
Категории поля Listing 6-11 Using для добавления геймплея
static const uint32_t gravityCategory = 0x1 << 0; |
static const uint32_t shieldCategory = 0x1 << 1; |
... |
SKFieldNode *gravity = [SKFieldNode radialGravityField]; |
gravity.strength = 3; |
gravity.categoryBitMask = gravityCategory; |
[planet addChild:gravity]; |
... |
ship.physicsBody.fieldBitMask = gravityCategory; |
... |
missile.physicsBody.fieldBitMask = shieldCategory; |
Так, время для реализации того силового поля. Один интересный способ сделать это с другим радиальным полем силы тяжести, но использованием отрицательной полевой силы: организации физики отражены далеко от поставки. Но поле, влияющее на целую сцену, могло бы быть больше, чем Вы хотите; вместо этого поле должно только влиять на соседние ракеты. Вы определяете область что поле эффекты с помощью двух свойств на полевом объекте узла.
Полевой узел
region
свойство определяет область, где поле может влиять на вещи. По умолчанию эта область покрывает всю сцену. Однако можно принять решение дать области конечную форму вместо этого. Для силового поля круговая область прекрасна, но другие формы возможны. Можно даже создать их использующий конструктивную геометрию набора (CSG).Полевой узел
falloff
свойство определяет, как быстро поле теряет свою силу. Можно принять решение иметь поле не, теряют силу вообще, или можно принять решение иметь его, уменьшаются более быстро, чем значение по умолчанию. Для радиального поля силы тяжести значение по умолчанию должно иметь его, понижаются на основе квадрата расстояния до центра другой организации. Не все типы поля затронутыfalloff
свойство.
Перечисление 6-12 добавляет временное силовое поле к ракете. Полевой узел создается и конфигурируется для отпора ракетам. Тогда круговая область добавляется для ограничения области, затронутой узлом, и поле сконфигурировано так, чтобы его сила понизилась более быстро как функция расстояния. Наконец, поле должно слабеть и исчезнуть так, чтобы поставка была весьма уязвима. Поле ослаблено с помощью действия, сначала анимирующего понижение силы ни к чему, и затем удаляющего узел экрана. В фактической игре эффект экрана мог бы быть украшен с графическим эффектом, представленным поверх поставки.
Узел Силового поля перечисления 6-12
SKFieldNode *shield = [SKFieldNode radialGravityField]; |
shield.strength = -5; |
shield.categoryBitMask = shieldCategory; |
shield.region = [[SKRegion alloc] initWithRadius:100]; |
shield.falloff = 4; |
[shield runAction:[SKAction sequence:@[ |
[SKAction strengthTo:0 duration:2.0], [SKAction removeFromParent]]]]; |
[ship addChild:shield]; |
Соединение организаций физики
Несмотря на то, что можно сделать много интересных игр, использующих системы физики, уже описанные, можно взять проекты далее путем соединения организаций физики с помощью соединений. Когда сцена моделирует физику, она принимает эти соединения во внимание при вычислении, как силы влияют на организации.
Таблица 6-3 описывает виды соединений, которые можно создать в Наборе Sprite.
Класс | Описание |
---|---|
Фиксированное соединение плавит две организации вместе в контрольной точке. Фиксированные соединения полезны для создания сложных форм, которые могут быть повреждены независимо позже. | |
Скользящее соединение разрешает точкам привязки двух организаций скользить вдоль выбранной оси. | |
Пружинное соединение действует как пружина, длина которой является начальным расстоянием между двумя организациями. | |
Предельное соединение налагает максимальное расстояние между двумя организациями, как будто они были соединены веревкой. | |
Шарнирное соединение прикрепляет две организации вместе. Организации вращаются независимо вокруг точки привязки. |
Вы добавляете или удаляете соединения с помощью мира физики. При создании соединения точки, соединяющие соединение, всегда указываются в системе координат сцены. Это может потребовать, чтобы Вы сначала преобразовали от координат узла до координат сцены прежде, чем создать соединение.
Для использования соединения физики в игре выполните эти шаги:
Создайте две организации физики.
Присоедините организации физики к паре
SKNode
объекты в сцене.Создайте объединенный объект с помощью одного из подклассов, перечисленных в Таблице 6-3.
Если необходимо, сконфигурируйте свойства объединенного объекта, чтобы определить, как должно работать соединение.
Получите сцену
SKPhysicsWorld
объект.Вызовите физику, в мире
addJoint:
метод.
Поиск организаций физики
Иногда, необходимо найти организации физики в сцене. Например, Вы, возможно, должны были бы:
Узнайте, расположена ли организация физики в области сцены.
Обнаружьте, когда организация физики (такая как та, которой управляет проигрыватель), пересечет определенную строку.
Проследите угол обзора между двумя организациями физики, чтобы видеть, вмешивается ли другая организация физики, такая как стена, между двумя объектами.
В некоторых случаях можно реализовать эти взаимодействия с помощью системы коллизий и контактов. Например, для обнаружения, когда организация физики вводит область Вы могли создать организацию физики и присоединить ее к невидимому узлу в сцене. Затем сконфигурируйте маску коллизии организации физики так, чтобы она никогда не сталкивалась ни с чем и ее контактной маской для обнаружения организаций физики, которыми Вы интересуетесь. Когда желаемые взаимодействия происходят, Вашего делегата контакта вызывают.
Однако не просто реализовать понятия, такие как угол обзора с помощью этого проекта. Для реализации их Вы используете мир физики сцены. С миром физики можно искать все организации физики вдоль луча или организации физики, пересекающие определенную точку или прямоугольник.
Пример иллюстрирует основной метод. Перечисление 6-13 показывает одну возможную реализацию системы обнаружения угла обзора. Это бросает луч от источника сцены в определенном направлении, ища самую близкую организацию физики вдоль луча. Если это находит организацию физики, то это тестирует маску категории, чтобы видеть, является ли это целью, которую это должно атаковать. Если это видит цель, определяемую для атаки, это стреляет в орудие.
Перечисление 6-13 Бросая луч от центра сцены
- (BOOL) isTargetVisibleAtAngle:(CGFloat)angle distance:(CGFloat) distance |
[ |
CGPoint rayStart = CGPointZero; |
CGPoint rayEnd = CGPointMake(distance*cosf(angle), distance*sinf(angle)); |
SKPhysicsBody *body = [self.physicsWorld bodyAlongRayStart:rayStart end:rayEnd]; |
return (body && body.categoryBitMask == targetCategory); |
} |
- (void) attackTargetIfVisible |
{ |
if ([self isTargetVisibleAtAngle: self.cannon.zRotation distance: 512]) |
{ |
[self shootCannon]; |
} |
} |
Другой способ реализовать то же поведение состоит в том, чтобы установить запуск и конечные позиции луча к тем из двух организаций физики в Вашей сцене. Например, Вы могли бы использовать расположение игрового объекта проигрывателя как одна позиция и позиция вражеского модуля как другая позиция.
Можно также выполнить поиски организаций физики, пересекающих точку или прямоугольник с помощью bodyAtPoint:
и bodyInRect:
методы.
Иногда Вы не можете сделать простое определение на основе самой близкой организации физики в сцене. Например, в логике Вашей игры, Вы могли бы решить, что не все организации физики блокируют угол обзора. В этом случае необходимо перечислить все организации физики вдоль луча с помощью enumerateBodiesAlongRayStart:end:usingBlock:
метод. Вы предоставляете блок, который вызывают один раз для каждой организации вдоль луча. Можно тогда использовать эту информацию для создания большего обоснованного решения о том, существует ли угол обзора к цели.
Подсказки и приемы для Использования физики в Вашей игре
Рассмотрите следующий совет при создании основанной на физике игры.
Разрабатывайте свои организации физики систематически
Перед расходами физики добавления слишком большого количества времени к сцене необходимо сначала понять, какие виды организаций Вы собираетесь включать в сцену и как они взаимодействуют друг с другом. Систематически проходите через этот процесс для каждой организации:
Действительно ли это - край, статический объем или динамический том? Посмотрите, что Вся Физика Моделируется на Организациях Физики.
Какая форма лучше всего приближает организацию, имея в виду, что некоторые формы являются в вычислительном отношении более дорогими, чем другие? Посмотрите Использование Форма Физики Который Соответствия Графическое представление
Какая организация - он и как это взаимодействует с другими организациями? Посмотрите Работу с Коллизиями и Контактами.
Эта организация перемещается быстро, или действительно ли это является очень маленьким? Если так, определите, необходимо ли обнаружение коллизий высокой точности. Посмотрите Указывают Коллизии Высокой точности для Маленьких или Стремительных Объектов.
Уклонение от чисел
В то время как полезно знать, что элементы мер по Набору Sprite в Международной системе единиц, волнующейся о точных числах, не настолько важны. Это не имеет значения очень ли Ваши веса ракеты 1 килограмм или 1,000,000
килограммы, пока масса является соответствующей другим значениям физики, используемым в игре. Часто, пропорции более важны, чем используемые фактические значения.
Игровой дизайн обычно является итеративным процессом, поскольку Вы настраиваете числа на моделировании. Этот вид проекта часто приводит ко многим трудно кодированным числам в Вашей игре. Сопротивляйтесь убеждению сделать это! Вместо этого реализуйте эти числа как данные, которые могут быть заархивированы с соответствующими объектами узла или организациями физики. Ваш код должен обеспечить способы поведения, но определенные числа, используемые для реализации тех способов поведения, должны быть доступными для редактирования значениями, которые художник или разработчик могут настроить или протестировать.
Большая часть информации, хранившей в организации физики и соответствующем узле, может быть заархивирована с помощью стандартных механизмов архивации, найденных в Какао. Это предполагает, что Ваши собственные инструменты могут также быть в состоянии сохранить и загрузить эти архивы и использовать их в качестве предпочтительного формата данных. Это обычно возможно, но имейте в виду, что форма организации физики является частными данными, которые не могут быть определены от объекта. Это означает, используете ли Вы действительно архивы в качестве основного формата для того, чтобы сохранить данные в Ваших инструментах, Вы, возможно, также должны заархивировать другую информацию, используемую для создания организации физики. Общая тема разработки инструментов с помощью Набора Sprite описана в Методах наиболее успешной практики Набора Sprite.
Большинство Свойств Физики Является Динамичным, поэтому Адаптируйте Их во Время выполнения
Фиксируются очень немного характеристик организации физики. За пределами области организации физики большинство свойств может быть изменено в любое время. Используйте в своих интересах это. Вот несколько примеров:
Можно заблокировать статический объем на месте, пока проигрыватель не выполняет задачу, разблокировавшую его. Затем измените организацию на динамический том.
Можно создать поле из многократных меньших организаций физики и содержать его вместе использование фиксированных соединений. Создайте части с контактной маской так, чтобы, когда они поражают что-то, делегат контакта мог повредить соединения.
Когда объект перемещается всюду по сцене, Вы корректируете ее линейное и вращательное затухание на основе носителя, в котором это находится. Например, когда объект перемещается в воду, Вы обновляете свойства для соответствия.