Создание Вашей сцены

Вы уже изучили много вещей о работе со сценами. Вот быстрое резюме важных фактов:

С теми фундаментальными понятиями в памяти, пора узнать больше о дереве узла и создании Ваших сцен.

Узел предоставляет систему координат своим дочерним элементам

Когда узел помещается в дерево узла, position свойство помещает его в системе координат, предоставленной ее родителем. Набор Sprite использует ту же систему координат и на iOS и на OS X. Рисунок 4-1 показывает систему координат Набора Sprite. Координатные значения измеряются в точках, как в UIKit или AppKit; в случае необходимости, когда сцена представляется, точки преобразовываются в пиксели. Положительная x координата идет вправо, и положительная координата y восстанавливает работоспособность экран.

Рисунок 4-1  система координат Набора Sprite

Набор Sprite также имеет стандартное соглашение вращения. Рисунок 4-2 показывает соглашение полярной координаты. Угол 0 радианы указывают положительную ось X. Положительный угол находится в направлении против часовой стрелки.

  Соглашения Полярной координаты рисунка 4-2 (вращение)

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

Только некоторые узлы содержат содержание

Не все узлы рисуют содержание. Например, SKSpriteNode класс рисует спрайт, но SKNode класс ничего не рисует. Можно сказать, рисует ли определенный объект узла содержание путем чтения frame свойство. Кадр является видимой областью системы координат родителя, которую вовлекает узел. Если узел рисует содержание, этот кадр имеет ненулевой размер. Для сцены кадр всегда отражает видимую часть координатного пространства сцены.

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

Создание сцены

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

Размер сцены определяет свою видимую область

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

Используя точку привязки для расположения системы координат сцены в представление

По умолчанию источник сцены помещается в нижний левый угол представления, как показано на рисунке 4-3. Так, сцена инициализируется с высотой 1024 и ширина 768, возникает (0,0) в нижнем левом углу, и (1024,768) координата в верхнем правом углу. frame свойство содержит (0,0)-(1024,768).

Сцена position свойство проигнорировано Набором Сцены, потому что сцена всегда является корневым узлом для дерева узла. Его значение по умолчанию CGPointZero и Вы не можете изменить его. Однако можно переместить источник сцены путем установки anchorPoint свойство. Точка привязки указана в координатном пространстве модуля и выбирает точку в представлении включения.

  Привязка к Значению по умолчанию рисунка 4-3 для сцены находится в нижнем левом углу представления

Значение по умолчанию для точки привязки CGPointZero, который помещает его в нижнем левом углу. Видимое координатное пространство сцены (0,0) к (width,height). Точка привязки по умолчанию является самой полезной для игр, не прокручивающих содержание сцены.

Второе наиболее распространенное значение точки привязки (0.5,0.5), который центрирует источник сцены посреди представления как показано на рисунке 4-4. Видимое координатное пространство сцены (-width/2,-height/2) к (width/2, height/2). Когда Вы хотите легко расположить узлы относительно центра экрана, такой как в игре прокрутки, центрирование сцены на ее точке привязки является самым полезным.

Рисунок 4-4  , Перемещающий точку привязки к центру представления

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

Содержание сцены масштабируется для адаптации представлению

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

При разработке игры необходимо выбрать стратегию обработки сцены size и scaleMode свойства. Вот наиболее распространенные стратегии:

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

  • Скорректируйте размер сцены в Вашей игре. Где необходимо, скорректируйте свою игровую логику и художественные активы для соответствия размера сцены.

  • Установите scaleMode свойство к SKSceneScaleModeResizeFill. Набор Sprite автоматически изменяет размеры сцены так, чтобы это всегда соответствовало размер представления. Где необходимо, скорректируйте свою игровую логику и художественные активы для соответствия размера сцены.

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

Перечисление 4-1  Используя режим масштаба для сцены фиксированного размера

- (void)createSceneContent
{
    self.scaleMode = SKSceneScaleModeAspectFit;
    self.backgroundColor = [SKColor blackColor];
// Add additional scene contents here.
...
}

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

Создание дерева узла

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

Таблица 4-1 перечисляет наиболее распространенные методы, используемые для создания дерева узла. Полный список методов предоставлен в Ссылке класса SKNode.

Табличные 4-1  Общие методы раньше управляли деревом узла

Метод

Описание

addChild:

Добавляет узел до конца списка получателя дочерних узлов.

insertChild:atIndex:

Вводит дочерний элемент в определенную позицию в списке получателя дочерних узлов.

removeFromParent

Удаляет узел получения из его родителя.

При необходимости к непосредственно поперечному в дереве узла Вы используете свойства в Таблице 4-2 для раскрытия структуры дерева.

Таблица 4-2  Transversing дерево узла

Свойство

Описание

дочерние элементы

Массив SKNode объекты, которые являются дочерними элементами узла получения.

родитель

Если узел является дочерним элементом другого узла, это содержит родителя. Иначе, это содержит nil.

сцена

Если узел включен где-нибудь в сцене, это возвращает узел сцены, который является корнем дерева. Иначе это содержит nil.

Понимание порядка получения на дерево узла

Стандартное поведение для рендеринга сцены следует за простой парой правил:

  • Родитель рисует свое содержание прежде, чем представить его дочерние элементы.

  • Дочерние элементы представляются в порядке, в котором они появляются в дочернем массиве.

Рисунок 4-5 показывает, как представляется узел с четырьмя дочерними элементами.

  Родители рисунка 4-5 нарисованы перед дочерними элементами

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

  1. Сцена представляет себя, очищая ее содержание к ее цвету фона.

  2. Сцена представляет узел космического корабля.

  3. Узел космического корабля представляет свои дочерние элементы, которые являются световыми сигналами на космическом корабле.

  4. Сцена представляет горные узлы, появляющиеся после узла космического корабля в массиве сцены дочерних элементов.

Поддержание порядка дочерних элементов узла может быть большой работой. Вместо этого можно дать каждому узлу явную высоту в сцене. Вы делаете это путем установки узла zPosition свойство. Z позиция является высотой узла относительно своего родительского узла, очень как узел position свойство представляет свою позицию x и y относительно позиции родителя. Таким образом, Вы используете z позицию для размещения узла выше или ниже позиции родителя.

Когда Вы принимаете z позиции во внимание, вот то, как представляется дерево узла:

  • Глобальная переменная каждого узла z позиция вычисляется.

  • Узлы нарисованы в порядке от самого маленького значения z до самого большого значения z.

  • Если два узла совместно используют то же значение z, наследователи представляются сначала, и одноуровневые элементы представляются в дочернем порядке.

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

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

Рисунок 4-6 показывает пример дерева, использующего z позиции для определения порядка рендеринга. В этом примере организация вертолета на высоте 100, и ее дочерние элементы представляются относительно ее высоты. Два узла ротора совместно используют ту же высоту, но не накладываются.

Рисунок 4-6  рендеринг Только для глубины может улучшить производительность

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

Тестирующий хит порядок является реверсом рисования порядка

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

Для узла, который рассмотрят во время тестирования хита, userInteractionEnabled свойство должно быть установлено в YES. Значение по умолчанию NO для любого узла кроме узла сцены. Узел, хотящий получить события, должен реализовать надлежащие методы респондента от своего родительского класса (UIResponder на iOS и NSResponder на OS X). Это - одно из нескольких мест, где необходимо реализовать специфичный для платформы код в Наборе Sprite.

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

Используя глубину узла для добавления других эффектов

Набор Sprite использует zPosition оцените только для определения тестирования хита и рисования порядка. Вы можете также z позиция для реализации собственных игровых эффектов. Например, Вы могли бы использовать высоту узла, чтобы определить, как она представляется или как она перемещается на экране. Таким образом можно моделировать эффекты параллакса или вуаль. Набор Sprite не создает эти эффекты для Вас. Обычно, Вы реализуете их путем обработки сцены сразу, прежде чем она будет представлена. Посмотрите, что Усовершенствованная Сцена Обрабатывает.

Узел применяет многие свои свойства его потомкам

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

Табличные 4-3  Свойства, влияющие на потомков узла

Свойство

Описание

xScale, yScale

Система координат узла масштабируется этими двумя факторами. Это свойство влияет на координатное преобразование, кадр узла, получение и тестирование хита. Его потомки так же масштабируются.

zRotation

Система координат узла повернута. Это свойство влияет на координатное преобразование, кадр узла, получение и тестирование хита. Его потомки так же масштабируются.

альфа

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

скрытый

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

скорость

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

Преобразование между координатными пространствами

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

Перечисление 4-2 показывает, как преобразовать позицию узла в систему координат сцены. Сцену просят выполнить преобразование. Помните, что позиция узла указана в системе координат ее родителя, таким образом, код передает node.parent как узел для преобразования из. Вы могли выполнить то же преобразование наоборот путем вызова convertPoint:toNode: метод.

Перечисление 4-2  , Преобразовывающее узел в систему координат сцены

    CGPoint positionInScene = [node.scene convertPoint:node.position fromNode:node.parent];

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