SpriteKit模板中GameScene.swift和GameScene.sks文件之间的关系是什么

时间:2014-11-05 19:34:35

标签: swift sprite-kit

我一直在玩SpriteKit,并且对于如何从代码中驱动它感觉非常体面,但我对Xcode 6中包含的关卡编辑器感到非常困惑。

我观看了wwdc视频(“平台状态​​联盟”和“spriteKit中的新内容”),并在网络上徘徊,但未能找到关于关卡编辑器的更多描述,以及它是什么真的在做。

我不明白,模板设置的两个文件是如何相关的? .sks文件是GameScene.swift文件的表达式,还是它包含的GameScene类?

或者它们是否只是在同一个场景中保存将要一起播放的单独对象/节点?

或者(这是我最好的解释)是.sks文件和编辑器基本上是为了使响应角色能够“活着”的环境?如果这是真的,.swift文件中的代码如何与.sks文件中的代码相关?

1 个答案:

答案 0 :(得分:24)

.sks文件是您的场景内容的静态存档。如果您之前使用过界面生成器来设置界面应用程序,那么如果实现方式不同,那么它的想法就大致相同。

在UI应用中,您可以在代码中执行所有操作:

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

或者你可以在IB(xib或故事板)中进行所有静态内容设置,并仅使用代码来设置应用程序的动态行为 - 当有人开始触摸这些按钮时发生的事情。当您这样做时,您编写代码的视图控制器作为xib / storyboard中的代理对象存在,从而在您在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 ...
}

即使在您开始添加代码以使其成为游戏之前,还有很多代码用于最终的图形化静态场景(输入处理,敌人行为,增加分数的物理回调或去玩游戏等)。并且它不适合用于从内容中分离出一般游戏逻辑的设计,因此在游戏中添加多个级别会更加困难。

相反,您可以使用Xcode中的SpriteKit编辑器来构建静态内容(级别),并坚持使用动态行为和游戏逻辑的代码。就像在IB中,视图控制器是故事板和代码之间的桥梁一样,场景类(模板中的GameScene.swift)是编辑器和代码之间的桥梁。当您在运行时加载.sks文件(此代码在模板中的GameViewController.swift中)时,它将成为您的GameScene类的实例,以及您在编辑器可以作为场景的子节点访问。

检查WWDC会谈是一个好主意,但是您错过了涵盖此内容的那个:有关SpriteKit编辑器背后的动机,如何使用它以及如何使用场景内容的更多信息,请参阅session 608: Best Practices for Building SpriteKit Games从场景代码中的.sks文件加载。