2016-06-24 7 views
0

このトピックについては、多くの矛盾した考えがあるようです。 私は単に私が使用した私のSKSceneでSKScene(Swift2 SpriteKit)SKSceneとUIViewControllerを効率的に切り替えるにはどうすればいいですか?

でのUIViewController、私のゲームで自分のメニューを持つことを望む:ノードが削除され

 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

答えて

1

まず:シーンを提示するコードは次のようになります。階層は次のように一般的です: - >UIViewSKView) -

UIViewController>

SKSceneはだからSKSceneUIView、そしてUIViewUIViewControllerに提示されていることができたSKViewに提示されています。

階層を知ったら、すべてが簡単です。メニューにはUIViewController、メニューにはGameSceneのものを使用する方法はさまざまです。

方法1

たとえば、あなたはRootViewControllerGameViewControllerMenuViewControllerを持つことができます。 RootViewControllerは、アプリ起動時の最初のViewControllerです。 RootViewController

は、あなたがGameViewControllerを提示する機能を作成することができます。

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

あなたはあなたGameViewControllerSKSceneを提示する必要があり、私はあなたがこのステップに精通している必要がありますね。あなたは、メニューを表示する必要があるとき

すると、次のような機能をRootViewControllerMenuViewControllerを追加することができます:あなたはまた、私はあなたが既に知っていると仮定し、このViewControllerを、であなたmenuViewを提示する必要があり

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

MenuViewControllerを却下する関数を作成:

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

そして、すべてが行われます。

方法2

あなたは、あなたがあなたのメニューを提示するself.view.addSuview(menuView)を使用することができ、また、一つだけUIViewControllerを持っていますが、UIViewとして、あなたのメニューを作成することができます。もちろん、あなたはまだself.view as SKViewであるルートビューを持っていますが、それはmenuViewの背後に隠れているので問題ではありません。あなたの更新質問

シーンが実際にself.view as SKViewあるので、あなたがシーンを削除することはできません、self.viewため

注 はのUIViewControllerのルート図であり、それを削除することはできません。あなたが実際にシーンを削除したい場合(ほとんどの場合、それは必要ではありません)、SKSceneを示す新しいSKViewを作成し、UIViewControllerSKViewを追加してself.view.addSubview(skView)で完全にシーンを削除したい場合は、 skView.removeFromSuperview()

+0

こんにちは、この回答に感謝、私はちょうどそれを実装しました。しかし、なぜそれから離れるときにMenuViewControllerを却下するのか、GameViewControllerを離れるのはなぜですか?また、あなたが書いたすべてのメソッドをクリアするには、RootViewControllerにも関数を終了する必要がありますか? – james

+0

@jamesもちろんGameViewControllerも却下することができますが、私のゲームではほとんどの場合、メニューがゲームのプレイを妨げないようにします。したがって、ユーザーがメニューを閉じるときに毎回、メニュービューを開いたときとまったく同じ状態にすることができます。 'GameViewController'を終了すると、新しい初期化されたゲームが戻ってきます。これに応じてこの動作を変更することができます。 –

+0

うまくいけば、これは私のビューの問題の最終面であるはずです。私の編集した質問では、私は方法1の実装を示します。ただし、viewDidLoad()のprintステートメントは機能しますが、ビューとその要素は機能しません。私が逃したものは分かりません。ありがとう。 – james

2

ビューとシーンが二つの異なるものです。シーンはビューの中に保持されます。あなたは単にあなたのメニュービュー内のシーンを提示したり、別のビューに移行してそこからSKSceneを提示しなければなりません。あなたはSKSceneUIViewControllerは全く別物であることを知っておく必要があり

let scene = GameScene(fileNamed: "GameScene") 
    let skView = self.view as! SKView 
    scene?.scaleMode = .AspectFit 
    skView.presentScene(scene) 
関連する問題