Какая связь между файлами GameScene.swift и GameScene.sks в шаблоне SpriteKit

Я играю с SpriteKit и получаю довольно приличное представление о том, как управлять им из кода, но довольно озадачен редактором уровня, включенным в Xcode 6.

Я смотрел видео wwdc ( "состояние платформ" и "что нового в spriteKit" ), и прокручивал по сети, но не смог найти много описания о редакторе уровня и что он действительно делать.

Что я не понимаю, как связаны два файла, с которыми связан шаблон? Является ли файл .sks выражением файла GameScene.swift или, возможно, содержит класс GameScene?

Или они оба просто держат отдельные объекты/узлы, которые будут играть вместе в одной сцене?

Или (это мое лучшее объяснение) является файлом .sks и редактором в основном для создания среды, в которой будут реагировать персонажи-отзывчивые персонажи? Если это так, как мой код в файле .swift связан с тем, что в файле .sks?

Ответ 1

Файл .sks представляет собой статический архив вашего содержимого сцены. Если раньше вы использовали Interface Builder для настройки приложений пользовательского интерфейса, то это очень похоже на идею, если она отличается от реализации.

В приложении UI вы можете делать все в коде:

override func viewDidLoad() {
    let someText = UITextField(...)
    let aButton = UIButton(...)
    // ... position everything
    // ... style everything
    // ... etc ...
}

Или вы можете выполнить статическую настройку содержимого в IB (xib или раскадровку) и использовать код только для настройки динамического поведения вашего приложения - то, что происходит, когда кто-то начинает касаться этих кнопок. Когда вы это делаете, контроллер представления, на который вы пишете код, существует как прокси-объект в xib/раскадровке, создавая мост между тем, что вы настроили в IB, и тем, что вы создали в коде.

В SpriteKit у вас такой же выбор. До Xcode 6 многие игры SK приняли подход всего кода:

override func didMoveToView(view: SKView) {
    let player = PlumberSprite(color: .Red)
    player.position = // ...
    player.physicsBody = // ...
    self.addChild(player)
    let ground = SKSpriteNode(...)
    ground.position = // ...
    ground.physicsBody = // ...
    self.addChild(ground)
    let block = QuestionBlockSprite()
    block.position = // ...
    block.physicsBody = // ...
    block.contents = CoinSprite()
    self.addChild(block)
    // ... etc etc etc ...
}

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

Вместо этого вы можете использовать редактор SpriteKit в Xcode для создания статического контента (уровней) и придерживаться кода для динамического поведения и логики игры. Как и в IB, контроллер просмотра является мостом между вашим раскадровкой и вашим кодом, ваш класс сцены (GameScene.swift в шаблоне) является мостом между редактором и кодом. Когда вы загружаете файл .sks во время выполнения (код для этого находится в GameViewController.swift в шаблоне), он становится экземпляром вашего класса GameScene, и все, что вы настроили в редакторе, доступно как дочерние узлы сцены.

Проверка протоколов WWDC - хорошая идея, но вы пропустили тот, который охватывает это: см. сеанс 608: лучшие практики для создания игр SpriteKit для получения дополнительной информации о мотивации за редактором SpriteKit, как его использовать и как работать с содержимым сцены, загруженным из файла .sks в код вашей сцены.