Моделирование физики

Моделирование физики в Наборе Sprite выполняется путем добавления организаций физики к сценам. Организация физики является моделируемым физическим объектом, подключенным к узлу в дереве узла сцены. Это использует позицию узла и ориентацию для размещения в моделирование. Каждая организация физики имеет другие характеристики, определяющие, как моделирование воздействует на нее. Они включают врожденные свойства физического объекта, такие как его масса и плотность, и также свойства, наложенные на него, такие как его скорость. Эти характеристики определяют, как организация перемещается, как она затронута силами на моделировании, и как она реагирует на коллизии с другими организациями физики.

Каждый раз, когда сцена вычисляет новый кадр анимации, она моделирует эффекты сил и коллизий на организациях физики, подключенных к дереву узла. Это вычисляет заключительную позицию, ориентацию и скорость для каждой организации физики. Затем сцена обновляет позицию и вращение каждого соответствующего узла.

Для использования физики в игре Вы должны:

Набор Sprite использует Международную систему единиц, также известную как SI или килограмм метра вторая система. Где необходимо, Вы, возможно, должны консультироваться с другими ссылочными материалами онлайн для узнавания больше об уравнениях физики, используемых Набором Sprite.

Вся Физика Моделируется на Организациях Физики

SKPhysicsBody объект определяет форму и параметры моделирования для организации физики в системе. Когда сцена моделирует физику, она выполняет вычисления для всех организаций физики, подключенных к дереву сцены. Так, Вы создаете SKPhysicsBody возразите, сконфигурируйте его свойства, и затем присвойте его узлу physicsBody свойство.

Существует три вида организаций физики:

Набор Sprite обеспечивает несколько стандартных форм, а также формирует на основе произвольных путей. Рисунок 6-1 показывает доступные формы.

  Организации Физики рисунка 6-1

Используйте форму физики, соответствующую графическое представление

В большинстве случаев организация физики должна иметь размер и форму, близко приближающую визуальное представление соответствующего узла. Например, на рисунке 6-2, ракета имеет узкую форму, не хорошо представленную или кругом или прямоугольником. Выпуклая форма многоугольника выбрана и адаптирована для соответствия иллюстраций спрайта.

  Соответствие рисунка 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, area, и density свойства все взаимосвязаны. При первом создании организации область организации вычисляется, и никогда не изменяется впоследствии. Другие два свойства изменяют значения одновременно, на основе следующей формулы:

mass = density x area

При конфигурировании организации физики у Вас есть две опции:

  • Установите mass свойство организации. density свойство тогда автоматически повторно вычисляется. Когда Вы хотите точно управлять массой каждой организации, этот подход является самым полезным.

  • Установите density свойство организации. mass свойство тогда автоматически повторно вычисляется. Когда у Вас есть набор подобных организаций, создаваемых с различными размерами, этот подход является самым полезным. Например, если бы Ваши организации физики использовались для моделирования астероидов, то Вы могли бы дать всем астероидам ту же плотность, и затем установить надлежащий многоугольник ограничения для каждого. Каждая организация автоматически вычисляет надлежащую массу на основе своего размера на экране.

Когда скорректировать свойства организации

Чаще всего Вы конфигурируете организацию физики один раз и затем никогда не изменяете ее. Например, масса организации вряд ли изменится во время игры. Однако Вы не ограничиваетесь в выполнении так. В то время как моделирование выполняется, некоторые виды игр могут потребовать возможности скорректировать свойства организации даже. Вот несколько примеров того, когда Вы могли бы сделать так:

  • На реалистическом моделировании ракеты ракета расходует топливо для применения тяги. Поскольку топливо израсходовано, масса изменений ракеты. Для реализации этого в Наборе Sprite Вы могли бы создать класс ракеты, включающий a fuel свойство. Когда ракета толкает, топливо сокращено, и масса соответствующей организации повторно вычисляется.

  • Свойства затухания обычно на основе характеристик организации и носителя, он перемещается через. Например, вакуум не применяет демпфирующих сил, и вода применяет больше демпфирующих сил, чем воздух. Если Ваша игра моделирует многократные среды, и организации могут переместиться между теми средами, Ваша игра может обновить свойства затухания организации каждый раз, когда это вводит новую среду.

Как правило, Вы вносите эти изменения как часть сцены пред - и последующая обработка. Посмотрите, что Усовершенствованная Сцена Обрабатывает.

Конфигурирование мира физики

Все организации физики в сцене являются частью мира физики, представленного в Наборе Sprite SKPhysicsWorld объект, присоединенный к сцене. Мир физики определяет две важных характеристики моделирования:

Создание организаций физики переместиться

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

Во-первых, можно управлять скоростью организации физики непосредственно путем установки 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 использует два механизма для ограничения числа взаимодействий в каждом кадре:

Коллизия и пример контакта: ракеты в пространстве

Систему контактов и коллизии проще понять путем исследования примера. В этом примере сцена используется для реализации игры пространства. Две ракеты дерутся на дуэли по части космоса. Эта область пространства имеет планеты и астероиды, с которыми могут столкнуться поставки. Наконец, потому что это - поединок, обе ракеты вооружены ракетами, они могут выстрелить друг в друга. Это простое описание определяет грубый геймплей для примера. Но реализация этого примера требует более точного выражения того, какие организации находятся в сцене и как они взаимодействуют друг с другом.

Из описания выше, Вы видите, что игра имеет четыре вида типов модуля, появляющихся в сцене:

  • Ракеты

  • Ракеты

  • Астероиды

  • Планеты

Небольшое количество типов модуля предполагает, что простой список категорий является хорошим проектом. Несмотря на то, что сцена ограничивается 32 категориями, для этого проекта только нужно четыре, один для каждого типа модуля. Каждая организация физики принадлежит одной и только одной категории. Так, ракета могла бы появиться как узел спрайта. Узел спрайта ракеты имеет связанную организацию физики, и та организация принадлежит ракетной категории. Другие узлы и организации физики определяются так же.

Учитывая те четыре категории, следующий шаг должен определить взаимодействия, разрешенные между этими организациями физики. Взаимодействия контакта обычно важны для занятия сначала, потому что их почти всегда диктует логика геймплея. Во многих случаях, если контакт обнаруживается, Вам нужна коллизия, которая будет вычислена также. Когда контакт приводит к одной из двух организаций физики, удаляемых из сцены, это наиболее распространено.

Таблица 6-1 описывает взаимодействия контакта для игры ракет.

Таблица 6-1  сетка контакта для игры ракет

Ракета

Ракета

Астероид

Планета

Ракета

Нет

Да

Да

Да

Ракета

Нет

Да

Да

Да

Астероид

Нет

Нет

Нет

Да

Планета

Нет

Нет

Нет

Нет

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

  • Ракета взрывается, когда она ударяет поставку, астероид или планету. Если ракетные удары поставка, поставка наносит ущерб.

  • Поставка, связывающаяся с поставкой, астероидом или планетой, наносит ущерб.

  • Уничтожается астероид, связывающийся с планетой.

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

Когда коллизии должны быть вычислены сценой, следующий шаг определяет. Каждая организация описывает, какие виды организаций в сцене могут столкнуться с нею. Таблица 6-2 описывает список разрешенных коллизий.

Таблица 6-2  сетка коллизии для игры ракет

Ракета

Ракета

Астероид

Планета

Ракета

Нет

Нет

Нет

Нет

Ракета

Нет

Да

Да

Да

Астероид

Нет

Да

Да

Нет

Планета

Нет

Нет

Нет

Да

При работе с коллизиями каждая информация о коллизии организации физики важна. Когда две организации сталкиваются, это возможно только для одной организации к затронутому коллизией. Когда это происходит, только скорость затронутой организации обновляется.

В таблице сделаны следующие предположения:

  • Ракеты всегда уничтожаются в любых взаимодействиях с другими объектами, таким образом, ракета игнорирует все коллизии с другими организациями. Точно так же ракеты, как полагают, имеют слишком мало массы, чтобы двигать другими телами в коллизии. Несмотря на то, что игра могла принять решение иметь ракеты, сталкиваются с другими ракетами, игра выбирает не, к тому, потому что будет много суетящихся ракет. Поскольку каждая ракета, возможно, должна была бы быть протестирована против любой ракеты, эти взаимодействия потребуют большого количества дополнительных вычислений.

  • Поставка отслеживает коллизии с поставками, астероидами и планетами.

  • Астероид игнорирует планетарные коллизии, потому что описание геймплея для контактов утверждает, что астероид будет уничтоженным.

  • Планеты отслеживают только коллизии с другими планетами. Ничто иное не имеет достаточно массы для перемещения планеты, таким образом, игра игнорирует те коллизии и избегает потенциально дорогих вычислений.

Реализация примера ракеты в коде

При определении классификаций и взаимодействий необходимо реализовать их в коде игры. Классификации и взаимодействия каждый определяются 32-разрядной маской. Каждый раз, когда потенциальное взаимодействие происходит, маска категории каждой организации тестируется против контакта и масок коллизии другой организации. Набор Sprite выполняет эти тесты логически Выполнением операции «И» эти две маски вместе. Если результатом является ненулевое число, то то взаимодействие происходит.

Вот то, как Вы превратили бы пример ракеты в код Набора Sprite:

  1. Определите значения маски категории:



      Маска Категории перечисления 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;
  2. Когда организация физики будет инициализирована, установите 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;
  3. Присвойте делегата контакта в мире физики сцены.

    Часто, протокол делегата реализован сценой. Дело обстоит так в Перечислении 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;
    }
  4. Реализуйте метод делегата контакта добавить игровую логику.



    Перечисление 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];

Вот некоторые причины, Вы могли бы использовать полевой узел, а не силу тяжести по умолчанию:

Ограничение эффекта полевых узлов через категории и области

По умолчанию полевой узел влияет на все организации физики в сцене. Однако это не должен быть этот путь. Путем тщательного управления, какие организации физики затронуты полевым узлом, можно создать некоторые интересные игровые эффекты.

Полевые узлы категоризированы точно так же, как организации физики. Точно так же организации физики объявляют, какие полевые категории влияют на них. Комбинируя эти два свойства, можно решить, какие виды полей реализованы игрой и какие организации физики затронуты каждым из тех полей. Как правило, Вы делаете это при помощи полевых категорий для определения общих впечатлений, что можно заскочить в игру. Например, предположите в настоящий момент реализацию примера Ракеты, и Вы хотите добавить силу тяжести к планете. Сила тяжести должна вытянуть поставки и астероиды к планете. Перечисление 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 соединяют узлы по-разному

Таблица 6-3 описывает виды соединений, которые можно создать в Наборе Sprite.

Табличные 6-3  классы Соединения реализованы в Наборе Sprite

Класс

Описание

SKPhysicsJointFixed

Фиксированное соединение плавит две организации вместе в контрольной точке. Фиксированные соединения полезны для создания сложных форм, которые могут быть повреждены независимо позже.

SKPhysicsJointSliding

Скользящее соединение разрешает точкам привязки двух организаций скользить вдоль выбранной оси.

SKPhysicsJointSpring

Пружинное соединение действует как пружина, длина которой является начальным расстоянием между двумя организациями.

SKPhysicsJointLimit

Предельное соединение налагает максимальное расстояние между двумя организациями, как будто они были соединены веревкой.

SKPhysicsJointPin

Шарнирное соединение прикрепляет две организации вместе. Организации вращаются независимо вокруг точки привязки.

Вы добавляете или удаляете соединения с помощью мира физики. При создании соединения точки, соединяющие соединение, всегда указываются в системе координат сцены. Это может потребовать, чтобы Вы сначала преобразовали от координат узла до координат сцены прежде, чем создать соединение.

Для использования соединения физики в игре выполните эти шаги:

  1. Создайте две организации физики.

  2. Присоедините организации физики к паре SKNode объекты в сцене.

  3. Создайте объединенный объект с помощью одного из подклассов, перечисленных в Таблице 6-3.

  4. Если необходимо, сконфигурируйте свойства объединенного объекта, чтобы определить, как должно работать соединение.

  5. Получите сцену SKPhysicsWorld объект.

  6. Вызовите физику, в мире 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.

Большинство Свойств Физики Является Динамичным, поэтому Адаптируйте Их во Время выполнения

Фиксируются очень немного характеристик организации физики. За пределами области организации физики большинство свойств может быть изменено в любое время. Используйте в своих интересах это. Вот несколько примеров:

  • Можно заблокировать статический объем на месте, пока проигрыватель не выполняет задачу, разблокировавшую его. Затем измените организацию на динамический том.

  • Можно создать поле из многократных меньших организаций физики и содержать его вместе использование фиксированных соединений. Создайте части с контактной маской так, чтобы, когда они поражают что-то, делегат контакта мог повредить соединения.

  • Когда объект перемещается всюду по сцене, Вы корректируете ее линейное и вращательное затухание на основе носителя, в котором это находится. Например, когда объект перемещается в воду, Вы обновляете свойства для соответствия.