2016-06-24 34 views
0

這個話題似乎有這麼多矛盾的想法。 我只是想有我在一個UIViewController菜單和我的比賽中SKScene(Swift2 SpriteKit)如何有效地切換SKScene和UIViewController?

在我SKScene我用:

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

節點被移除,但場面還是很到位的,因爲我仍然有灰色背景和fps計數器。我可以返回到UIViewController的視圖方面並隱藏場景嗎?

我的方法一種實現方式:

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

回答

1

首先,你需要知道SKSceneUIViewController是完全兩回事。層次結構通常是如下:

UIViewController - >UIViewSKView) - >SKScene

所以你SKScene呈現在SKView可以是UIView,那麼UIView呈現在UIViewController

一旦你知道層次結構,一切都很簡單。有很多方法可以使用不同的UIViewController作爲菜單和GameScene的東西。

方法一

例如,你可以有一個RootViewController,一個GameViewControllerMenuViewControllerRootViewController是應用程序啓動時的初始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) 
    } 

您還需要出示你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 SKView不能刪除場景,self.view是一個UIViewController的根本觀點,它不能被刪除。如果你真的想刪除你的場景(大多數情況下,這是沒有必要的),你可以創建一個新的SKView,目前你的SKScene,然後將這SKView添加到您的UIViewControllerself.view.addSubview(skView),當你想完全刪除場景,只需使用skView.removeFromSuperview()

+0

嗨,感謝這個答案,我剛剛實現它。然而,只是想知道爲什麼你只在離開它時忽略MenuViewController而不是GameViewController?另外,爲了清楚你寫的所有方法應該在RootViewController中,甚至是dismiss函數? – james

+0

@james當然,你也可以關閉'GameViewController',但在大多數情況下,在我的遊戲中,我不希望菜單中斷我的遊戲。所以每當用戶點擊關閉菜單時,他們可以在打開菜單視圖時使遊戲處於完全相同的狀態。如果你關閉了'GameViewController',那麼他們會回來一個新的初始化遊戲。您可以相應地更改此行爲。 –

+0

希望這應該是我觀點問題的最後一個方面。在我編輯的問題中,我展示了我的方法一個實現。但是,viewDidLoad()中的print語句有效,但視圖及其元素不起作用。不知道我錯過了什麼。謝謝。 – james

2

意見和場景是兩回事。場景保持在視圖內。您只需在菜單視圖中呈現一個場景或者轉換到另一個視圖並從那裏呈現SKScene。展示現場的代碼可能是這樣的:

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