SpriteKit
Создавайте игры, основанные на 2D спрайтах, используя оптимизированную систему анимации, физическое моделирование и поддержку обработки событий.
Обзор
SpriteKit – это инфраструктура отображения графики и анимации, которую вы можете использовать для анимации произвольных текстурированных изображений, также известных как спрайты. SpriteKit предоставляет традиционный цикл рендеринга, который чередуется между определением содержимого и рендеринга кадров. Вы определяете содержимое фрейма и как изменяется это содержимое. SpriteKit выполняет работу по рендерингу этого кадра с использованием графического оборудования. SpriteKit оптимизирован для применения произвольных анимаций или изменений в вашем контенте. Этот дизайн делает SpriteKit более подходящим для игр и приложений, требующих гибкости в обработке анимаций.
Спрайт-контент вырисовывается, представляя сцены внутри спринта
Вся анимация и рендеринг выполняются объектом SKView. Вы размещаете представление внутри окна, которое визуализирует его. Поскольку это представление, его содержимое можно комбинировать с другими представлениями по иерархии.
Содержимое в вашей игре организован в виде сцен, которые представлены объектами SKScene. Сцена содержит спрайты и остальной контент, который будет отображаться. Сцена также реализует покадровую логику и обработку контента. В любой момент времени представление показывает одну сцену. Пока представлена сцена, автоматически запускаются ее анимация и покадровая логика.
Чтобы создать игру или приложение с помощью SpriteKit, вы либо подклассифицируете класс SKScene, либо создаете делегат сцены для выполнения основных задач, связанных с игрой. Например, вы можете создать отдельные классы сцен, чтобы отобразить главное меню, экран игрового процесса и содержимое, отображаемое после окончания игры. Вы можете легко использовать один объект SKView в своем окне и переключаться между разными сценами. Когда вы переключаете сцены, вы можете использовать класс SKTransition для анимации между двумя сценами.
Дерево узлов определяет, что появляется в сцене
Класс SKScene является потомком класса SKNode. При использовании SpriteKit узлы являются фундаментальными строительными блоками для всего содержимого, причем объект сцены выступает в качестве корневого узла для дерева узлов. Сцена и его потомки определяют, какой контент нарисован и как он отображается.
Позиция каждого узла указана в системе координат, определенной ее родителем. Узел также применяет другие свойства к своему контенту и содержанию его потомков. Например, когда узел вращается, все его потомки также вращаются. Вы можете создать сложное изображение, используя дерево узлов, а затем повернуть, масштабировать и смешать все изображение, отрегулировав свойства самого верхнего узла.
Класс SKNode ничего не рисует, но применяет его свойства к своим потомкам. Каждый тип доступного контента представлен отдельным подклассом в SpriteKit. Некоторые другие подклассы узлов не используют собственный контент, а изменяют поведение своих потомков. Например, вы можете использовать объект SKEffectNode для применения фильтра Core Image ко всему поддереву в сцене. Точно контролируя структуру дерева узлов, вы определяете порядок, в котором они отображаются.
Все объекты узла являются объектами-респондентами, спускающимися либо от UIResponder, либо от NSResponder, поэтому вы можете подклассифицировать любой класс узла и создавать новые классы, которые принимают пользовательские данные. Класс view автоматически расширяет цепочку ответчиков, чтобы включить дерево узлов сцены.
См. Ссылку SKNode для получения дополнительной информации.
Текстуры сохраняют многоразовые графические данные
Текстуры, представленные как объекты SKTexture, являются общими изображениями, используемыми для рендеринга спрайтов. Всегда используйте текстуры, когда вам нужно применить одно и то же изображение к нескольким спрайтам. Обычно вы создаете текстуры, загружая файлы изображений, хранящиеся в вашем приложении. Однако SpriteKit также может создавать текстуры для вас из других источников прямо во время выполнения, включая изображения Core Graphics или даже путем рендеринга дерева узлов в текстуру.
SpriteKit упрощает управление текстурами, обрабатывая код нижнего уровня, необходимый для загрузки текстур и обеспечения их доступности графическому оборудованию. Управление текстурой происходит автоматически средствами SpriteKit. Однако, если ваша игра использует большое количество изображений, вы можете улучшить ее производительность, взяв под свой контроль части процесса. Прежде всего, явно сообщая SpriteKit когда нужно загружать текстуру.
Атлас текстуры представляет собой группу текстур, объединенных в один файл, которые используются вместе в вашей игре. Например, вы можете использовать атлас текстуры для хранения всех текстур, необходимых для анимации символа или всех фрагментов, необходимых для воспроизведения фона уровня игрового процесса. SpriteKit использует текстурные атласы для улучшения производительности рендеринга.
См. Ссылки на SKTexture и SKTextureAtlas для получения дополнительной информации.
Узлы Выполнять действия для анимации содержимого
Содержимое сцены анимируется с помощью действий. Каждое действие является объектом, определенным классом SKAction. Вы указываете узлам выполнение действий. Затем, когда сцена обрабатывает кадры анимации, действия выполняются. Некоторые действия завершаются в одном кадре анимации, в то время как другие действия применяют изменения по нескольким кадрам анимации перед завершением. Наиболее часто используемым действием является анимирование изменений свойств узла. Например, вы можете создавать действия, которые перемещают узел, масштабируют или поворачивают его или делают его прозрачным. Однако действия могут также изменять дерево узлов, воспроизводить звуки или даже выполнять собственный код.
Действия очень полезны, но вы также можете комбинировать действия для создания более сложных эффектов. Вы можете создавать группы действий, которые запускаются одновременно или последовательности, где действия выполняются последовательно. Вы можете автоматически активировать действия.
Сцены также могут выполнять пользовательскую обработку в каждом кадре. Вы переопределяете методы подкласса сцены для выполнения дополнительных игровых задач. Например, если нужно переместить узел в каждый кадр, вы можете настроить его свойства непосредственно для каждого кадра вместо того, чтобы использовать это действие.
Для получения дополнительной информации см. Ссылку SKAction.
Добавление физических тел и суставов для моделирования физики в вашей сцене
Вы можете контролировать точное положение каждого узла в сцене, но часто вы хотите, чтобы эти узлы ещё и взаимодействовали друг с другом, сталкиваясь и передавая изменения скорости в процессе. Вы также можете выполнять вещи, которые не относятся к действиям, например, имитация силы тяжести и других сил. Для этого вы создаете физические тела (SKPhysicsBody) и присоединяете их к узлам вашей сцены. Каждое физическое тело определяется формой, размером, массой и другими физическими характеристиками. Сцена определяет глобальные характеристики для моделирования физики в прикрепленном объекте SKPhysicsWorld. Вы используете мир физики для определения силы тяжести для всего моделирования и определения скорости моделирования.
Когда физические тела включены в сцену, сцена имитирует физику на этих телах. Некоторые силы, такие как трение и гравитация, применяются автоматически. Другие силы могут быть применены автоматически к нескольким физическим телам, добавив объекты SKFieldNode к сцене. Вы также можете напрямую воздействовать на конкретное поле тела, изменяя его скорость напрямую или применяя к нему силы или импульсы. Ускорение и скорость каждого тела также вычисляются, как и столкновение тел друг с другом. Затем, после завершения моделирования, обновляются позиции и вращения соответствующих узлов.
У вас есть точный контроль над тем, какие физические эффекты взаимодействуют друг с другом. Например, вы можете указать, что конкретный физический узел поля влияет только на конкретное подмножество физических тел в сцене. Вы также решаете, какие физические тела могут сталкиваться друг с другом, и отдельно решать, какие взаимодействия запускают события в вашем приложении. Вы используете эти события для добавления логики игры. Например, ваша игра может уничтожить узел, когда одно физическое тело поражается другим физическим телом.
Вы также можете использовать физический мир, чтобы найти физические тела в сцене и связать физические тела вместе с помощью сустава (SKPhysicsJoint). Связанные тела взаимодействуют вместе в зависимости от типа сустава.
См. «Моделирование физики» для получения дополнительной информации.
Начало работы с SpriteKit
SpriteKit реализует контент как иерархическую древовидную структуру узлов. Дерево узлов состоит из узла сцены в качестве корневого узла и других узлов, которые предоставляют контент. Каждый кадр сцены обрабатывается и отображается в представлении. Сцена выполняет действия и имитирует физику, изменяя содержимое дерева. Затем сцена эффективно рендерится с помощью SpriteKit.
Чтобы начать изучение SpriteKit, вы должны посмотреть на эти классы в следующем порядке, прежде чем переходить к другим классам в рамках:
- SKView
- SKScene
- SKNode
- SKSpriteNode
- SKAction
- SKPhysicsBody
Создание вашей первой сцены
Содержимое SpriteKit помещается в окно, как и другой визуальный контент. Содержание SpriteKit отображается классом SKView. Содержимое, которое визуализирует объект SKView, называется сценой, которая является объектом SKScene. Сцены участвуют в цепочке ответчиков и имеют другие функции, которые делают их подходящими для игр.
Поскольку контент SpriteKit визуализируется объектом вида, вы можете объединить это представление с другими представлениями в иерархии представлений. Например, вы можете использовать стандартные кнопки управления и размещать их над вашим представлением SpriteKit. Или вы можете добавить интерактивность к спрайтам, чтобы реализовать свои собственные кнопки. Выбор остается за вами. Позже в этом примере вы увидите, как реализовать интерактивность на сцене.
SKView можно добавить в качестве дочернего элемента в UIView, или вы можете явно отобразить представление своего контроллера представления в виде SceneKit либо через раскадровки, используя Custom Class, либо в коде. В следующем листинге показано, как вы можете переопределить метод viewDidLoad () контроллера представления, чтобы отобразить его представление в SKView:
Листинг 1: Передача представления диспетчера вида в SKView
override func viewDidLoad() { super.viewDidLoad() view = SKView() } var skView: SKView { return view as! SKView }
С созданным представлением SpriteKit следующим шагом при отображении содержимого является создание сцены. Как правило, вы должны подклассифицировать SKScene для каждой требуемой сцены, но простота, следующий код просто создает экземпляр нового объекта сцены, отображаемого в представлении:
Листинг 2: Создание и представление сцены
let scene = SKScene(size: CGSize(width: 1024, height: 768)) override func viewWillAppear(_ animated: Bool) { skView.presentScene(scene) }
Чтобы отображать содержимое в SpriteKit, соответствующий узел добавляется в сцену или дочерний элемент сцены. Последним шагом в этом примере для отображения метки является создание SKLabelNode и добавление его в сцену:
Листинг 3: Добавить ярлык на сцену
let label = SKLabelNode(text: "SpriteKit") label.position = CGPoint(x: scene.size.width / 2, y: scene.size.height / 2) scene.addChild(label)