在Swift中将方法从一个SKScene调用到另一个方法的最简洁方法是什么?

所以我在游戏中有3个不同的场景:MenuScene,GameScene和GameOverScene。

我想知道如何从GameOverScene中获取GameScene中得分变量,这样我就可以在玩家失败之后在那里展示它。

所以在GameScene中,我创建了这个简单的getter:

func getScore() -> Int { return self.score } 

但是如果我尝试从不同的场景中执行GameScene.getScore(),我会收到错误。

在func之前尝试使用“class”

 class func getScore() -> Int { return self.score } 

但是这也给了我一个来自GameScene的错误说:

“实例成员’得分’不能用于GameScene类型”

那么最好的方法是怎样的呢? 我不想为此创建一个全局变量,这将是丑陋的。

实际上这很容易。 当您转到新场景时,您也可以使用它传递变量…这是一个示例。

GameOverScene.swift

 var score:Int = 0 

GameScene.swift

 var score:Int = THE USERS SCORE func segue(){ let gameScene = GameOverScene(size: self.size) gameScene.score = score let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5) gameScene.scaleMode = SKSceneScaleMode.AspectFill self.scene!.view?.presentScene(gameScene, transition: transition) } 

您需要在MenuScene类中保留GameScene的实例(推荐)。 或者,您可以将分数存储在全局存储介质中。

要进入游戏场景,您需要先创建它,对吧?

 let scene = SKScene(fileNamed: "blah blah blah") view.presentScene(scene) 

现在,不是创建场景并将其分配给局部变量,而是将其分配给类级变量。

 var gameScene: GameScene? override func touchesBegan(touches: Set, withEvent event: UIEvent?) { if (...) { gameScene = SKScene(fileNamed: "blah blah blah") view.presentScene(gameScene!) } } 

然后,在适当的时候,您可以像这样访问分数:

 gameScene.getScore() 

另一种方法是使用NSUserDefaults ,但你似乎不喜欢它。

我能想到的最后一种方法是使用静态变量。 你将所有需要在类中的两个场景之间传递的东西作为静态变量。 这样做的缺点是,除非您将类声明为private并将两个场景和类放在同一个文件中,否则其他类可以访问和更改变量。 这降低了可维护性。

顺便说一句,Swift中不需要明确的getter。

有很多方法可以实现您想要做的事情。 您可以使用管理器类,共享实例来维护游戏变量。

为什么选择这个?

因为您需要保存您的值或个人资料,或者您希望重置所有游戏进度,因为您需要在解锁第18级时选择旧的第2级,或者在不累积值的情况下重复失败的级别。 这样做很快,你可以单独处理你的常见游戏变量(似乎我在广告中卖盆…)

 class Settings: NSObject { // NSCoding in case you want to save your data var score: Int = 0 func encodeWithCoder(aCoder: NSCoder!) { aCoder.encodeInteger(score, forKey: "score") } init(coder aDecoder: NSCoder!) { score = aDecoder. decodeIntegerForKey("score") } override init() { super.init() // do whatever you want to initializing your settings } } class GameManager: NSObject { static let sharedInstance = GameManager() var settings : Settings! = Settings() } class MenuScene: SKScene { let gameManager = GameManager.sharedInstance override func didMoveToView(view: SKView) { print("the current score is \(self.gameManager.settings.score)") } } class GameScene: SKScene { let gameManager = GameManager.sharedInstance override func didMoveToView(view: SKView) { print("the current score is \(self.gameManager.settings.score)") } } class GameOverScene: SKScene { let gameManager = GameManager.sharedInstance override func didMoveToView(view: SKView) { print("the current score is \(self.gameManager.settings.score)") } }