【发布时间】:2017-04-11 04:28:57
【问题描述】:
SpriteKit 游戏结束后,我想回到我的UIKit MenuViewController。根据我目前所学到的,使用 protocol/delegate 是最好的(?)选项,但我无法让它发挥作用。我知道该协议可能会超出GameViewController 的类声明,看起来像:
protocol GameViewControllerDelegate {
var gameOver: Bool?
}
但我需要帮助从 GameScene 访问它并让它关闭 GameViewController。以下是应用程序的基本内容,以防万一。
MenuViewController
class MenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func goToGame(_ sender: UIButton) {
performSegue(withIdentifier: "toGameSegue", sender: sender.currentTitle)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? GameViewController {
if let item = sender as? String {
destinationVC.numberOfPlayers = item
}
}
}
}
GameViewController
class GameViewController: UIViewController {
var numberOfPlayers: String?
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
if let scene = SKScene(fileNamed: "GameScene") {
scene.scaleMode = .aspectFill
scene.userData = NSMutableDictionary()
scene.userData?.setObject(numberOfPlayers!, forKey: "numberOfPlayers" as NSCopying)
view.presentScene(scene)
}
}
}
...
游戏场景
class GameScene: SKScene {
var howManyPlayers: String?
override func didMove(to view: SKView) {
if let numPlayers = self.userData?.value(forKey: "numberOfPlayers") {
howManyPlayers = numPlayers as? String
}
print(howManyPlayers!)
}
...
这个 SpriteKit 游戏有一个 MenuViewController、一个 GameViewController 和一个 GameScene。当您从 MenuViewController 按下按钮时,数据会通过 segue 发送到 GameViewController。在 GameViewController 呈现 GameScene 之前,它将数据存储在场景的 userData 变量中,以便 GameScene 可以访问它。在这个例子中,它是玩家的数量。
【问题讨论】:
-
你正在做的 IMO 是 UIKit 与 SpriteKit 的不必要混合。如果您在 Alessandro 的回答中做类似的事情,它当然会起作用,我不能说您不应该这样做,但这将是一种首选方式:stackoverflow.com/a/35409586/3402095 我说首选,因为这是可以看到的迄今为止在 Apple 的演示游戏中。
-
绝对 - 混合 UIKit 和 SpriteKit 比我想象的要复杂。我的想法是我对约束很满意,我需要很多按钮,为什么不呢?现在我知道了。
标签: ios swift sprite-kit skscene