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



所以我在游戏中有三个不同的场景: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)")
    } 
}

最新更新