Sprite Kit中的增量分数显示在HUD中

时间:2015-12-15 22:31:08

标签: ios swift sprite-kit

我知道我已经接近让比分增加到我的游戏中。

当我明确更改代码以添加整数(例如5)而不是"%d"时,当触摸硬币时,分数会显示在HUD中:

func didBeginContact(contact: SKPhysicsContact) {
    lblScore.text = String(format: "%d", GameState.sharedInstance.score)
} 

为:

func didBeginContact(contact: SKPhysicsContact) {
    lblScore.text = String(format: "5", GameState.sharedInstance.score)
}

enter image description here

但是,如果我离开"%d",则没有任何反应。我不确定如何增加HUD中的分数或在哪里进行更改。

这是代码的其余部分。

GameScene.swift:

struct PhysicsCategory {

  static let None: UInt32              = 0
  static let Player: UInt32            = 0b1     
  static let CoinNormal: UInt32        = 0b1000  
  static let CoinSpecial: UInt32       = 0b10000  
}

class GameScene: SKScene, SKPhysicsContactDelegate {

 // HUD 
 var hudNode: SKNode!
 var lblScore: SKLabelNode!
 var lblCoins: SKLabelNode!

 override func didMoveToView(view: SKView) {

   // HUD
   hudNode = SKNode()
   hudNode.zPosition = 1000
   cameraNode.addChild(hudNode)


   // Coins
   // 1
   let coin = SKSpriteNode(imageNamed: "powerup05_1")
   coin.position = convertPoint(CGPoint(x: 300, y: self.size.height-100), toNode: cameraNode)
   coin.zPosition = 1000
   hudNode.addChild(coin)

   // 2
   lblCoins = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
   lblCoins.fontSize = 70
   lblCoins.fontColor = SKColor.whiteColor()
   lblCoins.position = convertPoint(CGPoint(x: 375, y: self.size.height-100), toNode: cameraNode)
   lblCoins.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Left
   lblCoins.zPosition = 1000

   // 3
   lblCoins.text = String(format: "X %d", GameState.sharedInstance.coins)
   hudNode.addChild(lblCoins)

   // Score
   // 4
   lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
   lblScore.fontSize = 70
   lblScore.fontColor = SKColor.whiteColor()
   lblScore.position = convertPoint(CGPoint(x: self.size.width-325, y: self.size.height-100), toNode: cameraNode)
   lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Right
   lblScore.zPosition = 1000

   // 5
   lblScore.text = "0"
   hudNode.addChild(lblScore)
  }
}

func didBeginContact(contact: SKPhysicsContact) {

  lblScore.text = String(format: "%d", GameState.sharedInstance.score)
}

GameState.swift:

class GameState {
  var score: Int
  var highScore: Int
  var coins: Int

  init() {
    // Init
    score = 0
    highScore = 0
    coins = 0

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

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

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

    score = max(score, highScore)

    // Store in user defaults
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setInteger(highScore, forKey: "highScore")
    defaults.setInteger(coins, forKey: "coins")
    NSUserDefaults.standardUserDefaults().synchronize()
  }

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

    return Singleton.instance
  }
}

2 个答案:

答案 0 :(得分:0)

我可以看到您使用GameState.sharedInstance.score来存储分数。但你永远不会更新它。每次玩家得分时你都必须增加分数。这部分:

 lblScore.text = String(format: "%d", GameState.sharedInstance.score)

仅从分数变量中读取。

此部分也没有意义:

highScore = max(score, highScore)

score = max(score, highScore)  //remove this

得分变量与高分变量不同。

答案 1 :(得分:0)

我能够通过这一行增加分数:

GameState.sharedInstance.score += 1

或者用一个你想要增加的点数替换另一个数字。