11

この質問に対する答えを見つけるのに苦労しています。それほど難しいことではないと思います。

ビューコントローラーで定義されたメソッドとプロパティを SKScene から参照するにはどうすればよいですか?

それに基づいて、別の SKScene 内から読み込まれた SKScene から ViewController をどのように参照できますか?

4

5 に答える 5

5

理論的にはそうすべきではありませんが、実際には...

self.view.window.rootViewController
于 2014-07-10T23:31:40.543 に答える
3

スプライト キット シーンを終了して呼び出し元のビュー コントローラーに戻るための NSNotification メソッドをありがとう。これは、UIKit に戻る簡単な方法であり、私のコードを投稿します。私は迅速に取り組んでおり、Swift で作業する人のために 4 行のコードを追加しました。このコードは、viewDidLoad 関数でビュー コントローラーに追加されました。

override func viewDidLoad() {
    super.viewDidLoad()

    if let scene = GameLevels.unarchiveFromFile("GameLevels") as? GameLevels{
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        //set up notification so scene can get back to this view controller
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "quitToLevel:", name: "quitToLevelID", object: nil)
        skView.presentScene(scene)
    }
}

// Function to pop this view controller and go back to my Levels screen
func quitToLevel(notification: NSNotification) {
    self.navigationController!.popViewControllerAnimated(true)
}

View Controllerに戻るために、SKsceneのtouchesBegan関数にこのコードを追加しました

            else if nodeTouched.name == "quit"
        {
            NSNotificationCenter.defaultCenter().postNotificationName("quitToLevelID", object: nil)
        }

ここで「quit」labelNode を押すと、シーンを表示したビュー コントローラーで quitToLevel という関数を実行できます。この関数は、ナビゲーション コントローラーを使用しているため、メイン画面に戻りますが、あらゆる目的に使用できます。

シーンを終了する他のいくつかの方法を試しましたが、View Controller への参照を失う複数のシーンでジャンプすると問題が発生しました。この方法ならどんなシーンでも使える

于 2015-05-05T05:42:43.867 に答える
0

これは最も洗練されたソリューションではありませんが、SKScene サブクラスから GameViewController への「後方参照」はどうでしょうか。このようなもの:

// call from GameViewController
let scene = HomeScene(size:screenSize, scaleMode:SKSceneScaleMode.AspectFill, viewController: self)

SKScene サブクラスは次のようになります。

class HomeScene: SKScene {
    var viewController:GameViewController
    init(size:CGSize, scaleMode:SKSceneScaleMode, viewController:GameViewController) {
        self.viewController = viewController
        super.init(size:size)
        self.scaleMode = scaleMode
    }
}

以降:

func gameOver(){
    self.viewController.loadHighScoreScene()
}

SKNode とそのサブクラスには既にプロパティ.parent.sceneプロパティがあるため、このアプローチが前代未聞というわけではありません。ええ、私たちは依存関係をハードコーディングし、コードをより緊密に結合していますが、書くコードは少ないので、すべてが悪いわけではありません.

于 2016-02-27T02:57:02.970 に答える