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

时间:2016-07-29 23:23:46

标签: ios swift sprite-kit

所以我在游戏中有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类型”

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

3 个答案:

答案 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)")
    } 
}