当前位置: 首页 > 面试题库 >

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

萧晓博
2023-03-14
问题内容

我一直在玩SpriteKit,并且对如何从代码中驱动它有了相当不错的感觉,但是对于Xcode 6中包含的关卡编辑器却颇为困惑。

我已经看过wwdc视频(“平台联合状态”和“ spriteKit中的新功能”),并在网上搜寻,但未能找到有关关卡编辑器及其实际功能的大量描述。

我不明白,模板设置的两个文件之间有什么关系?.sks文件是GameScene.swift文件的表达式还是它包含的GameScene类?

还是它们都只是持有将在同一场景中一起播放的单独的对象/节点?

或者(这是我最好的解释)是.sks文件和编辑器基本上是用于使响应字符能够“存活”的环境吗?如果是这样,.swift文件中的代码如何与.sks文件中的代码相关?


问题答案:

.sks文件是场景内容的静态存档。如果您以前曾使用Interface Builder来设置UI应用程序,则其构想大致相同,即使实现方式不同。

在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对话是一个好主意,但您错过了涵盖该主题的对话:请参阅第608节:构建SpriteKit游戏的最佳实践,以了解有关SpriteKit编辑器背后的动机,如何使用它以及如何与现场合作的更多信息。从.sks场景代码中的文件加载的内容。



 类似资料:
  • 我看到这里 老实说,我不理解这张纸条。它们是否意味着有可能用MonadPlus永远中断,例如IO Bool?比如说,IO False将破坏它。。。 当然,我可以破例或者永远实现自己的,但我的兴趣是关于这个奇怪的音符。

  • 问题内容: 我发现了一个示例,在该示例中,将按钮添加到面板(的实例),然后将面板添加到容器(的实例),然后根据构造将容器包括在(窗口)中。 我尝试了两件事: 我摆脱了容器。在更多详细信息中,我将按钮添加到面板(实例为),然后将面板添加至窗口(实例为)。工作正常。 我摆脱了面板。在更多详细信息中,我直接将按钮添加到了容器,然后将容器添加到了窗口(的实例)。 所以,我不明白两件事。 为什么我们有两种竞

  • 问题内容: 我最近学习了如何在工作流程中使用virtualenv和virtualenvwrapper,但是我在一些指南中看到了pyenv,但是我似乎无法理解pyenv是什么以及它与virtualenv有何不同/相似。pyenv是virtualenv的更好/更新的替代品还是免费的工具?如果后者有什么不同之处,以及两者(以及适用的virtualenvwrapper)如何一起工作? 问题答案: Pyen

  • 我正在学习ASP.NET Core3.1。 注意到当我们开始这个项目的时候。它将转到ConfigureServices并注入一个服务。 我的问题是为什么服务可以使用那些扩展方法? 谢了。

  • 我正在使用Drools 6.2.0。最终,我需要使用window:time处理一组事件。每个事件都有一个日期字段。 在我的drl中: e1 (2015-01-01 00:00:00) e2 (2015-01-01 00:00:20) e3 (2015-01-01 00:00:40) e4 (2015-01-01 00:01:00) 场景1:使用实时并同时插入集合a事件。 场景2:使用pseudo,