所以我在游戏中有三个不同的场景:MenuScene、GameScene和GameOverScene。
我想知道如何从GameOverScene中获取GameScene的分数变量,以便在玩家输了之后将其显示在那里。
所以在GameScene中,我创建了一个简单的getter:
func getScore() -> Int {
return self.score
}
但如果我尝试从另一个场景执行GameScene.getScore(),我会遇到错误。
尝试在函数之前使用"class"
class func getScore() -> Int {
return self.score
}
但这也给了我一个来自GameScene的错误:
"实例成员'score'不能用于类型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<UITouch>, 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)")
}
}