所以我在游戏中有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类型”
那么最好的方法是怎样的?我不想为此创建一个全局变量,这将是丑陋的。
答案 0 :(得分:4)
实际上这很容易。当你转向新场景时,你也可以传入一个变量...这是一个例子。
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)
}
答案 1 :(得分:2)
您需要在GameScene
课程中保留MenuScene
的实例(推荐)。或者,您可以将分数存储在全局存储介质中。
要进入游戏场景,您需要先创建它,对吗?
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,btw。
中不需要明确的getter答案 2 :(得分:1)
有很多方法可以实现您想要做的事情。您可以使用经理类,共享实例来维护游戏变量。
因为您需要保存您的值或个人资料,或者您希望重置所有游戏进度,因为您需要在解锁第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)")
}
}