繁体   English   中英

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

[英](Swift2 SpriteKit) How to transition between an SKScene and a UIViewController efficiently?

关于这个话题似乎有很多矛盾的想法。 我只是希望将菜单放在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") 
}
}

print(“ menu”)出现在我的控制台中,但是菜单ViewController的实际视图和所有资产都没有出现。

另一方面,我的GameViewController及其SKScene工作正常。

MenuViewController

视图和场景是两个不同的事物。 场景保存在视图内部。 您只需要在菜单视图中呈现一个场景或过渡到另一个视图,然后从那里呈现一个SKScene。 呈现场景的代码可能如下所示:

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

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

UIViewController > UIViewSKView )-> SKScene

因此,将SKScene呈现在可以是UIViewSKView中,然后将UIView呈现在UIViewController

一旦了解了层次结构,一切就变得容易了。 有很多方法可以将不同的UIViewController用于菜单和GameScene

方法一

例如,您可以具有RootViewControllerGameViewControllerMenuViewController RootViewController是应用程序启动时的初始ViewController。

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

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

您需要为您呈现SKSceneGameViewController ,我想你应该熟悉这一步。

然后,当需要显示菜单时,可以使用以下功能将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)展示菜单。 当然,您可以使用root视图,因为它是self.view as SKViewself.view as SKView仍然存在,但是没关系,因为它隐藏在menuView的后面。

有关更新问题的注释

由于现场其实是无法删除的场景self.view as SKViewself.view是一个UIViewController的根本观点,它不能被删除。 如果您确实要删除场景(大多数情况下没有必要),则可以创建一个新的SKView来展示您的SKScene ,然后在需要时通过self.view.addSubview(skView)将此SKView添加到UIViewController 。完全删除场景,只需使用skView.removeFromSuperview()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM