在swift spriteKit中使用NSUserDefault在新场景中显示高分

在swift spriteKit中使用NSUserDefault在新场景中显示高分,swift,sprite-kit,nsuserdefaults,skscene,Swift,Sprite Kit,Nsuserdefaults,Skscene,我正在用SpriteKit做一个游戏,它保存了玩家的高分。当游戏结束时,它会过渡到另一个场景(结束场景)。我搞不懂如何在最后一幕中显示高分。我的高分代码: func updateHighScore(){ //save current points label value let pointsLabel = childNodeWithName("pointsLabel") as! DDPointsLabel let highScoreLabel = childNodeWit

我正在用SpriteKit做一个游戏,它保存了玩家的高分。当游戏结束时,它会过渡到另一个场景(结束场景)。我搞不懂如何在最后一幕中显示高分。我的高分代码:

func updateHighScore(){
    //save current points label value
    let pointsLabel = childNodeWithName("pointsLabel") as! DDPointsLabel
    let highScoreLabel = childNodeWithName("highScoreLabel") as! DDPointsLabel

    if highScoreLabel.number < pointsLabel.number {
        highScoreLabel.setTo(pointsLabel.number)

        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setInteger(highScoreLabel.number, forKey: "highscore")
    }
}

func loadHighScore(){
    let defaults = NSUserDefaults.standardUserDefaults()
    let highScoreLabel = childNodeWithName("highScoreLabel") as! DDPointsLabel
    highScoreLabel.setTo(defaults.integerForKey("highscore"))

}
func updatehighhscore(){
//保存当前点标签值
将pointsLabel=childNodeWithName(“pointsLabel”)设为!DDPointsLabel
将highScoreLabel=childNodeWithName(“highScoreLabel”)设为!DDPointsLabel
如果highScoreLabel.number
要加载highscore,您需要一个int来保存highscore,我不确定您想用highscore标签做什么,但要加载它,您需要执行
var highscore=defaults.integerworky(“highscore”)
对于标签,您可以执行
highScoreLabel.text=“Score\(highscore)”

此答案假设您在游戏场景中正确显示了分数。如果是这样,那么除了游戏场景文件之外,还要创建两个其他Swift文件:1)GameState.Swift和2)EndGameScene.Swift

在GameState.swift中,创建一个如下的共享实例

class GameState {
  var score: Int
  var highScore: Int


  class var sharedInstance: GameState {
    struct Singleton {
      static let instance = GameState()
    }

    return Singleton.instance
  }


    init() {
      score = 0
      highScore = 0

      // Load game state
      let defaults = NSUserDefaults.standardUserDefaults()

      highScore = defaults.integerForKey("highScore")
      stars = defaults.integerForKey("stars")
    }

    func saveState() {

      // Update highScore if the current score is greater
      highScore = max(score, highScore)

      // Store in user defaults
      let defaults = NSUserDefaults.standardUserDefaults()
      defaults.setInteger(highScore, forKey: "highScore")
      defaults.setInteger(stars, forKey: "stars")
      NSUserDefaults.standardUserDefaults().synchronize()
    }
}
    // Score
    let lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
    lblScore.fontSize = 60
    lblScore.fontColor = SKColor.whiteColor()
    lblScore.position = CGPoint(x: self.size.width / 2, y: 300)
    lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
    lblScore.text = String(format: "%d", GameState.sharedInstance.score)
    addChild(lblScore)

    // High Score
    let lblHighScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
    lblHighScore.fontSize = 30
    lblHighScore.fontColor = SKColor.cyanColor()
    lblHighScore.position = CGPoint(x: self.size.width / 2, y: 150)
    lblHighScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
    lblHighScore.text = String(format: "High Score: %d", GameState.sharedInstance.highScore)
    addChild(lblHighScore)
在游戏场景文件中,确保正确创建了标签。如果是这样,那么找到你的代码,为你的玩家创建点数。也许在发生碰撞的地方。然后添加游戏状态共享实例。它看起来像这样

lblStars.text = String(format: "X %d", GameState.sharedInstance.stars)
lblScore.text = String(format: "%d", GameState.sharedInstance.score)
在EndGameSene中,确保使用标签调用GameState.sharedInstance。代码看起来像这样

class GameState {
  var score: Int
  var highScore: Int


  class var sharedInstance: GameState {
    struct Singleton {
      static let instance = GameState()
    }

    return Singleton.instance
  }


    init() {
      score = 0
      highScore = 0

      // Load game state
      let defaults = NSUserDefaults.standardUserDefaults()

      highScore = defaults.integerForKey("highScore")
      stars = defaults.integerForKey("stars")
    }

    func saveState() {

      // Update highScore if the current score is greater
      highScore = max(score, highScore)

      // Store in user defaults
      let defaults = NSUserDefaults.standardUserDefaults()
      defaults.setInteger(highScore, forKey: "highScore")
      defaults.setInteger(stars, forKey: "stars")
      NSUserDefaults.standardUserDefaults().synchronize()
    }
}
    // Score
    let lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
    lblScore.fontSize = 60
    lblScore.fontColor = SKColor.whiteColor()
    lblScore.position = CGPoint(x: self.size.width / 2, y: 300)
    lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
    lblScore.text = String(format: "%d", GameState.sharedInstance.score)
    addChild(lblScore)

    // High Score
    let lblHighScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
    lblHighScore.fontSize = 30
    lblHighScore.fontColor = SKColor.cyanColor()
    lblHighScore.position = CGPoint(x: self.size.width / 2, y: 150)
    lblHighScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
    lblHighScore.text = String(format: "High Score: %d", GameState.sharedInstance.highScore)
    addChild(lblHighScore)
然后,回到游戏场景,添加gameOver属性

var gameOver = false
仍在游戏场景中,添加以下方法:

func endGame() {

  gameOver = true

  // Save high score
  GameState.sharedInstance.saveState()

  let reveal = SKTransition.fadeWithDuration(0.5)
  let endGameScene = EndGameScene(size: self.size)
  self.view!.presentScene(endGameScene, transition: reveal)
}
一定要打电话给

endGame() 
。。。无论玩家在哪里耗尽生命

您可能需要添加:

if gameOver {
  return 
}
。。。在游戏场景中,更新游戏性的位置


要获得更多帮助,您应该在第2部分中搜索ray wenderlich。该教程中有关于保存和显示游戏分数的好信息和代码。

该答案可能重复,当我尝试使用它时会出现错误,我想我在寻找不同的答案