[英]How can I reference a GameScene.swift file as a base for the rest of my game levels?
[英]How can I dismiss a ViewController from my GameScene.swift?
问题:如何从GameScene.swift中关闭ViewController?
情况:我的SpriteKit游戏中有2个VC,如下所示:
ViewController.swift ----按Play -----> GameViewController
当玩家失败时,我想解散GameViewController,以便玩家可以再次按下play。 我在GameScene.swift中检查玩家的损失,并希望从那里解散GameVC。
注意:用谷歌搜索没有成功。
我尝试过的是:
1)在我的GameScene.swift中创建一个gameVC实例并将其关闭,如下所示:
let gameVC = GameViewController()
gameVC.dismissViewController(false,completion: nil)
2)做:
self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
那些由于明显原因而无法工作^^
您不想“抢”现有实例: https : //pragprog.com/articles/tell-dont-ask
您需要将GameScene
交给视图控制器的引用,以便可以将其关闭,也可以使用委托模式向后传递给控制对象,以使VC自行关闭/关闭。
一个简单的例子……您可以将GameViewController
属性添加到GameScene
,然后在适当的时间关闭VC:
class GameScene: SKScene {
var gameVC: GameViewController?
func gameDidEnd() {
gameVC?.dismissViewControllerAnimated(true) {
// if desired, do any cleanup after the VC is dismissed
}
}
}
然后,首先在创建GameScene
对象时设置此属性:
if let gameScene = GameScene(fileNamed: "MyScene") {
gameScene.gameVC = someGameVC
}
这种简单的方法将把GameScene
和GameViewController
紧密地结合在一起,如果您想不使用其他对象就很难使用它们。 但是对于这个简单的用例,可能很好。
我已经关注了您的一些讨论。 我想添加一些代码,因为通常我倾向于使用一个或两个ViewController和许多SKScene和SKNode,但是在这种情况下,使用currentViewController参考可能会很有用:
class MyModelScene: SKScene {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var currentViewController : MyModelViewController! = MyModelViewController()
// MyModelViewController is a customized UIViewController
override func didMoveToView(view: SKView) {
super.didMoveToView(view)
print("---")
print("∙ \(NSStringFromClass(self.dynamicType))")
print("---")
}
}
class Level1Scene: MyModelScene {
...
}
在UIViewController
:
class PreloadViewController: MyModelViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = Level1Scene(fileNamed:"Level1Scene") {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsPhysics = true
skView.showsNodeCount = true
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .ResizeFill
scene.currentViewController = self
skView.presentScene(scene)
}
}
}
使用此代码,您在SKScene
始终具有currentViewController引用,并且可以检查它是否是您要关闭的正确viewController。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.