この質問に対する答えを見つけるのに苦労しています。それほど難しいことではないと思います。
ビューコントローラーで定義されたメソッドとプロパティを SKScene から参照するにはどうすればよいですか?
それに基づいて、別の SKScene 内から読み込まれた SKScene から ViewController をどのように参照できますか?
この質問に対する答えを見つけるのに苦労しています。それほど難しいことではないと思います。
ビューコントローラーで定義されたメソッドとプロパティを SKScene から参照するにはどうすればよいですか?
それに基づいて、別の SKScene 内から読み込まれた SKScene から ViewController をどのように参照できますか?
理論的にはそうすべきではありませんが、実際には...
self.view.window.rootViewController
スプライト キット シーンを終了して呼び出し元のビュー コントローラーに戻るための 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 への参照を失う複数のシーンでジャンプすると問題が発生しました。この方法ならどんなシーンでも使える
これは最も洗練されたソリューションではありませんが、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
プロパティがあるため、このアプローチが前代未聞というわけではありません。ええ、私たちは依存関係をハードコーディングし、コードをより緊密に結合していますが、書くコードは少ないので、すべてが悪いわけではありません.