【问题标题】:How can I load a spritekit file different than GameScene.swift in my GameViewController.swift?如何在我的 GameViewController.swift 中加载不同于 GameScene.swift 的 spritekit 文件?
【发布时间】:2016-01-21 02:18:20
【问题描述】:

在 GameViewController.swift 中,我找到了这一行

if let scene = GameScene(fileNamed:"GameScene") {

而且我一直认为,如果我想加载 GameScene.swift 以外的内容,我可以将“GameScene”更改为“LandingPage”,一切都会正常运行。但是,正如我最近发现的那样,这里的“GameScene”实际上是指 GameScene.sks 而不是 swift 文件。

我希望制作一个包含多个关卡的游戏,每个关卡都写在自己的 swift 文件中。我要去哪里/如何从 level1.swift 移动到 level2.swift?

【问题讨论】:

    标签: xcode swift sprite-kit swift2 xcode7


    【解决方案1】:

    如果您在一个场景中,例如关卡选择场景,比如说LevelSelectionScene.swift,您可以通过SKView 的-presentScene:transition: 方法转到另一个场景。

    class LevelSelectionScene: SKScene {
    
        override func didMoveToView(view: SKView) { /* ... */}
    
        func selectLevel(level: Int) {
            let fadeTransition = SKTransition.fadeWithDuration(0.3)
            if let selectedLevel = createLevelSceneWithLevel(level) {
                self.view?.presentScene(selectedLevel, transition: fadeTransition) 
            }
        }
    
    
        // Not a good idea if you progressively adding new levels,
        // it's totally depend on how you gonna organize your levels.
        // Since its level input is not arbitrary, the output of this
        // rarely nil, if it does, it must be the developer mistake.
        func createLevelSceneWithLevel(level: Int) -> SKScene? {
            let levelScene: SKScene?
            switch level {
                case 1: levelScene = Level1()
                case 2: levelScene = Level2()
                default: levelScene = nil
            }
            return levelScene
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      正如上面有人所说的“fileNamed:“GameScene”“

       if let scene = GameScene(fileNamed:"GameScene") {
      

      引用 GameScene.sks 文件,它相当于游戏的故事板。

      如果您创建一个新的 SKScene 类并尝试以这种方式从另一个 SKScene 或 gameViewController 加载它,它将无法工作,因为它找不到相应的 sks 文件。

      我不是 100% 确定如何创建一个新的 sks 文件,因为我没有在我的游戏中使用它。

      如果您只想加载您创建的新场景,您可以在 gameViewController 中使用此代码

      let skView = self.view as! SKView
      let scene = NewScene(size: skView.bounds.size)
      
      skView.ignoresSiblingOrder = true
      skView.multipleTouchEnabled = true
      scene.scaleMode = .AspectFill
      skView.presentScene(scene)
      

      如果您想从 SKScene 类加载另一个场景,其代码基本相同

      let newScene = NewScene(size: self.size) //size of current scene
      let  transition = SKTransition.doorsCloseHorizontalWithDuration(0.5) // use transition between 2 SKScenes
      let skView = self.view as! SKView            
      skView.ignoresSiblingOrder = true
      skView.multipleTouchEnabled = true
      newScene.scaleMode = .AspectFill
      skView.presentScene(newScene, transition: transition)
      

      或者更简洁的版本

      let newScene = NewScene(size: self.size)
      let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5)
      newScene.scaleMode = SKSceneScaleMode.AspectFill
      self.view?.presentScene(newScene, transition: transition)
      

      【讨论】:

        【解决方案3】:

        您可以在自定义类检查器中为每个场景文件指定自定义类名。这是“实用工具”窗格中最右侧的选项卡。

        自定义类(必须是 SKScene 的子类)在加载 sks 文件时加载。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        相关资源
        最近更新 更多