(Swift2 SpriteKit)如何有效地在SKScene和UIViewController之间进行转换?

时间:2016-06-24 23:11:29

标签: ios xcode swift

关于这个话题似乎有很多矛盾的想法。 我只想将我的菜单放在UIViewController中,将我的游戏放在SKScene

在我使用的SKScene中:

        self.removeFromParent()
        self.view?.presentScene(nil)

节点被移除但场景仍然存在,因为我仍然有灰色背景和fps计数器。我可以返回到UIViewController的View方面并隐藏场景吗?

我的方法一个实现:

RootViewController的:

class RootViewController: UIViewController {

var menu = MenuViewController()
var game = GameViewController()

override func viewDidLoad() {
    super.viewDidLoad()

    print("root")
    MenuPresent()
}

func GamePresent() {
    self.addChildViewController(game)
    self.view.addSubview((game.view)!)
    game.didMoveToParentViewController(self)
}

func MenuPresent() {
    self.addChildViewController(menu)
    self.view.addSubview((menu.view)!)
    menu.didMoveToParentViewController(self)
}

func menuDismiss() {
    menu.willMoveToParentViewController(nil)
    menu.removeFromParentViewController()
    menu.view.removeFromSuperview()
}

}

MenuViewController:

class MenuViewController: UIViewController {

//var root = RootViewController()

override func viewDidLoad() {
    super.viewDidLoad()

    print("menu") 
}
}

打印("菜单")出现在我的控制台中,但是实际视图和MenuViewController的所有资源都没有出现。

另一方面,我的GameViewController和它的SKScene工作正常。

MenuViewController

2 个答案:

答案 0 :(得分:2)

视图和场景是两回事。场景保存在视图内。您只需在菜单视图中显示一个场景或转换到另一个视图并从那里呈现SKScene。呈现场景的代码可能如下所示:

    let scene = GameScene(fileNamed: "GameScene")
    let skView = self.view as! SKView
    scene?.scaleMode = .AspectFit
    skView.presentScene(scene)

答案 1 :(得分:1)

首先,您需要知道SKSceneUIViewController完全是两件不同的事情。层次结构通常如下:

UIViewController - > UIViewSKView) - > SKScene

因此,您SKScene中的SKView可以是UIViewUIView会显示UIViewController

一旦了解了层次结构,一切都很简单。有很多方法可以使用不同的UIViewController菜单和GameScene内容。

方法一

例如,您可以拥有RootViewControllerGameViewControllerMenuViewControllerRootViewController是应用启动时的初始ViewController。

RootViewController中,您可以创建一个函数来展示GameViewController

  func setupGameViewController() {
    self.gameViewController = GameViewController()
    self.addChildViewController(gameViewController!)
    self.view.addSubview((gameViewController!.view)!)
    gameViewController?.didMoveToParentViewController(self)
  }

您需要在SKScene中向您显示GameViewController,我想您应该熟悉此步骤。

然后,当您需要显示菜单时,可以使用以下功能将MenuViewController添加到RootViewController

  func setupMenuViewController() {
    self.menuViewController = MenuViewController()
    self.addChildViewController(menuViewController!)
    self.view.addSubview((menuViewController!.view)!)
    menuViewController?.didMoveToParentViewController(self)
  }

您还需要在此ViewController中显示menuView,我想您已经知道了。

还创建一个功能来关闭MenuViewController

  func removeMenuViewController(){
    self.menuViewController?.willMoveToParentViewController(nil)
    self.menuViewController?.removeFromParentViewController()
    self.menuViewController?.view.removeFromSuperview()
  }

一切都已完成。

方法二

您也可以只有一个UIViewController,但是创建一个UIView菜单,然后您可以使用self.view.addSuview(menuView)来展示您的菜单。当然你的根视图,self.view as SKView仍然存在,但它并不重要,因为它隐藏在menuView后面。

有关更新问题的说明

您无法删除场景,因为场景实际上是self.view as SKViewself.view是UIViewController的根视图,无法删除。如果你真的想删除你的场景(在大多数情况下,没有必要),你可以创建一个新的SKView来展示你的SKScene,然后将此SKView添加到UIViewController self.view.addSubview(skView)的{​​{1}},如果要完全删除该场景,只需使用skView.removeFromSuperview()