从Spritekit场景切换回情节提要

时间:2019-04-25 10:40:40

标签: swift xcode sprite-kit

简而言之,我想从一个spritekit场景转到Main Storyboard中的一个视图。从主故事板迅速转到spritekit场景很容易。但是我不知道该如何回到情节提要。谢谢您的帮助。干杯。

1 个答案:

答案 0 :(得分:0)

初始viewController:一个空的viewController,带有一个用于显示GameViewController的按钮

GameViewController:“ Hello World” Sprite-kit模板中的典型GameViewController。 (这是两个脚本的简化版本,因为您当然会有更多的代码,但是,为了共享我所做的事情,这更容易)

我的目标:我想展示我的SKScene游戏中的第一个viewController,并正确分配场景。

说明:为了获得结果,我扩展了SKSceneDelegate类以构建自定义协议/委托,该协议/委托使从GameViewController过渡到第一个初始控制器(主菜单)。此方法可以扩展到游戏的其他viewControllers。在返回主菜单功能中使用此委托。在调用spritekit脚本的类之前,请务必先放置此函数。

这两个脚本如下所示。希望这对其他有我疑问的人有所帮助。

UIViewController:

import UIKit
import SpriteKit
class GameViewController: UIViewController,TransitionDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill
                scene.delegate = self as TransitionDelegate
                view.presentScene(scene)
            }
        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }
}
func returnToMainMenu(){
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    guard  let storyboard = appDelegate.window?.rootViewController?.storyboard else { return }
    if let vc = storyboard.instantiateInitialViewController() {
        print("go to main menu")
        self.present(vc, animated: true, completion: nil)
    }
  }
}

游戏脚本:

import SpriteKit
protocol TransitionDelegate: SKSceneDelegate {
    func returnToMainMenu()
}
class GameScene: SKScene {
   override func didMove(to view: SKView) {
        self.run(SKAction.wait(forDuration: 2),completion:{[unowned self] in
            guard let delegate = self.delegate else { return }
            self.view?.presentScene(nil)
            (delegate as! TransitionDelegate).returnToMainMenu()
        })
    }
     deinit {
        print("\n THE SCENE \((type(of: self))) WAS REMOVED FROM MEMORY (DEINIT) \n")
    }
}