Используем SpriteKit для создания анимации в Swift

[От редакции: после публикации статьи оказалось, что в ней есть заимствования из статьи «Using SpriteKit to create animations in Swift». Благодарим Dim Walker за внимательность]

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

SpriteKit — это нативный игровой движок от Apple, представленный впервые в iOS 7 и Mac OS 10.9. Обычно он используется для создания 2D-игр. Но это не мешает ему быть хорошим инструментом при создании анимаций, 2D-текстур и не только. Например, на WWDC 2017 Apple раскрыла, что задействовала SpriteKit в UI для Memory Debugger в Xcode.

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

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

SpriteKit очень удобен для создания несложных анимационных сцен, таких как полноэкранная анимация загрузки, иллюстрация в Onboarding- и Tutorial-экранах или в других элементах пользовательского интерфейса. Для наглядности попробуем создать анимацию загрузки, в которой будут использоваться 4 emoji: Tangerine, Lemon, Peach, Mango.

Настройка сцены

Все содержимое в SpriteKit-сцене представлено объектом SKScene. Затем ее наполнение определяется с помощью так называемых нод (node), позволяющих создавать иерархию наподобие применяемой в UIViews или CALayers. Сцена является root-нодой в иерархии.

Для наполнения сцены используются определенные сабклассы SKNode:

  • SKSpriteNode подойдет для создания контента на базе спрайтов;
  • SKLabelNode — для работы с текстовым контентом;
  • SKLightNode — для управления светом на сцене;
  • SKEmitterNode — для создания эффекта частиц, то есть дыма, огня, искр и других;
  • SKShapeNode — для создания простых графических элементов из математических точек, линий и кривых;
  • SKReferenceNode, SKAudioNode, SKCameraNode, SKVideoNode... Полный список можно посмотреть в документации.

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

Благодаря этим приемам мы сможем оживить нашу картинку и привести ее элементы в движение.

Итак, приступим!

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

func makeScene() -> SKScene {
        
        let minimumDimension = min(view.frame.width, view.frame.height)
        let size = CGSize(width: minimumDimension, height: minimumDimension)
        let scene = SKScene(size: size)
        scene.backgroundColor = .white
        return scene
 }

Мы презентуем SKScene через SKView (который является сабклассом от UIView), добавив определенные манипуляции по изменению размера и центрированию. Теперь можно сделать present сцены:

import UIKit
import SpriteKit
 
final class ViewController: UIViewController {
 
  private let animationView = SKView()
  
  override func viewDidLoad() {
    super.viewDidLoad()
 
    view.addSubview(animationView)
    let scene = makeScene()
    animationView.frame.size = scene.size
    animationView.presentScene(scene)
  }
  
  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
 
    animationView.center.x = view.bounds.midX
    animationView.center.y = view.bounds.midY
  }
}

Добавление нод

Имея сцену для рендеринга, можно начать добавлять контент.

Так как в текущем примере будут использоваться самые простые emoji-смайлики в качестве текстур, удобнее всего будет применить SKLabelNode (аналог UILabel в UIkit).

Итак, приступим к созданию extension для SKLabelNode, позволяющего рендерить emoji:

extension SKLabelNode {
  
  func renderEmoji(_ emoji: Character) {
    fontSize = 50
    text = String(emoji)
    
    verticalAlignmentMode = .center
    horizontalAlignmentMode = .center
  }
}

Далее, напишем еще один из методов, чтобы добавить все смайлики на сцену.

func addEmoji(to scene: SKScene) {
    let allEmoji: [Character] = ["


					  
Похожие статьи:
Кіпрська Weplay Media Holding Limited — власниця торгової марки Parimatch — подала до суду на президента Володимира Зеленського з вимогою скасувати...
Представляємо третю статтю літнього циклу про зарплати українських ІТ-спеціалістів. Раніше ми публікували дані, які стосуються...
Итак, мы переехали из одной самой большой страны Европы в другую: если учитывать Гренландию, то № 1 по территории — это Дания,...
В опросе приняло участие 3982 человека. Исходные данные для анализа есть на GitHub. Мы же ищем аналитика для проведения этого...
Женя РозинскийНедавно на DOU висел огромный баннер о бесплатном вебинаре «Продажи в US глазами американских заказчиков»....
Яндекс.Метрика