Усовершенствованная обработка сцены

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

Как сцена обрабатывает кадры анимации

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

Процесс анимации и рендеринга сцены связывается к объекту сцены (SKScene). Обработка сцены и действия работает только, когда представлена сцена. Представленная сцена выполняет цикл рендеринга, чередующийся между обработкой дерева узла сцены и рендерингом ее. Эта модель подобна рендерингу и обработке цикла, используемого в большинстве игр.

Рисунок 5-1 показывает шаги, используемые сценой для выполнения цикла рендеринга.

  Обработка Кадра рисунка 5-1 в сцене

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

  1. Сцена update: метод вызывают со временем, истекшим до сих пор на моделировании.

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

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

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

  3. Сцена didEvaluateActions метод вызывают после того, как все действия для кадра были обработаны.

  4. Сцена моделирует физику на узлах в дереве, имеющих организации физики.

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

  5. Сцена didSimulatePhysics метод вызывают после того, как вся физика для кадра была моделирована.

  6. Сцена применяет любые ограничения, связанные с узлами в сцене.

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

  7. Сцена вызывает didApplyConstraints метод.

  8. Сцена вызывает didFinishUpdate метод.

    Это - Ваш последний шанс внести изменения в сцену.

  9. Сцена представляется.

Работа с делегатами сцены

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

Последующая обработка в сценах

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

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

Пример: центрирование сцены на узле

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

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

Рисунок 5-2  , Организующий сцену для мира прокрутки

Камера помещается в мире. Мир может скользить вокруг в сцене. Поскольку камера является узлом, можно использовать действия — и даже физику — для перемещения камеры. Затем на шаге последующей обработки Вы меняете местоположение мирового узла в сцене так, чтобы узел камеры центрировался на сцене, как показано на рисунке 5-3. Мир помещается в сцену так, чтобы центрировался символ. Затем символ перемещен в мире. Наконец, шаг последующей обработки меняет местоположение мира так, чтобы символ центрировался снова.

Рисунок 5-3  мир перемещен в сцене

Вот шаги для этой реализации:

  1. Поместите точку привязки сцены в центре сцены.

    self.anchorPoint = CGPointMake (0.5,0.5);
  2. Используйте мировой узел для представления мира прокрутки.

    SKNode *myWorld = [SKNode node];
    [self addChild:myWorld];

    Дочерние элементы мирового узла являются узлами спрайта (или другие узлы), которые представляют содержание игры. (Кодируйте не показанный).

  3. Используйте узел в мире для представления камеры.

    SKNode *camera = [SKNode node];
    camera.name = @"camera";
    [myWorld addChild:camera];
  4. Используйте didFinishUpdate метод для центрирования сцены на камере.

    - (void)didFinishUpdate
    {
        [self centerOnNode: [self childNodeWithName: @"//camera"]];
    }
     
    - (void) centerOnNode: (SKNode *) node
    {
        CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent];
        node.parent.position = CGPointMake(node.parent.position.x - cameraPositionInScene.x,                                       node.parent.position.y - cameraPositionInScene.y);
    }

    centerOnNode: метод преобразовывает текущую позицию камеры в координаты сцены, затем вычитает те координаты из позиции в мире для скольжения символа к (0,0) позиция.

Пример: добавление наложения отладки

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

  • Решения искусственного интеллекта символов в сцене

  • Расположения в мире тот триггер написали сценарий действий

  • Информация о физике, такая как сила тяжести, другие силы, или даже размер организаций физики

Форма и узлы метки особенно полезны для аннотирования поведения Вашей игры.

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

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

  1. Создайте свойство для узла отладки в классе сцены и инициализируйте его, когда будет сначала представлена сцена.

    @property (SKNode *) debugOverlay;
     
    self.debugOverlay = [SKNode node];
    [self addChild:self.debugOverlay];
  2. Удалите узел, прежде чем будут обработаны действия.

    - (void)update:(NSTimeInterval)currentTime
    {
        [self.debugOverlay removeFromParent];
        [self.debugOverlay removeAllChildren];
    }
  3. Добавьте узел после того, как будет обработана сцена.

    - (void)didFinishUpdate
    {
        [self addChild:self.debugOverlay];
        // add code to create and add debugging images to the debug node.
        // This example displays a gravity vector.
        SKShapeNode *gravityLine = [[SKShapeNode alloc] init];
        gravityLine.position = CGPointMake (200,200);
     
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathMoveToPoint(path, NULL, 0.0, 0.0);
        CGPathAddLineToPoint(path, 0, self.physicsWorld.gravity.x*10, self.physicsWorld.gravity.y*10);
        CGPathCloseSubpath(path);
        gravityLine.path = path;
        CGPathRelease(path);
     
        [self.debugOverlay addChild: gravityLine]; }

Пример: тиражирование информации в сцене

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

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

copyNode.position = originalNode.position;

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