Reputation: 223
I'm making a game with SpriteKit and it saves the player's high score. When the game ends it transitions into a different scene (endScene). I can't figure out how to display the high score in the endScene. Code I have for my high score:
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"))
}
Upvotes: 0
Views: 319
Reputation:
This answer assumes that you are properly displaying the score in the GameScene. If so, then in addition to the GameScene file, create two other Swift files: 1) GameState.swift and 2) EndGameScene.swift.
Inside GameState.swift, create a shared instance like this ...
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()
}
}
Inside of the GameScene file, make sure you properly created the labels. If so, then find your code that creates points for your player. Perhaps where there is a collision. Then add the GameState shared instance. It will look something like this ...
lblStars.text = String(format: "X %d", GameState.sharedInstance.stars)
lblScore.text = String(format: "%d", GameState.sharedInstance.score)
In your EndGameScene, make sure you call GameState.sharedInstance with your labels. The code will look something like this ...
// 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)
Then, back in GameScene, add a gameOver property ...
var gameOver = false
Still in GameScene, add this method:
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)
}
Be sure to call ...
endGame()
... wherever the player runs out of lives.
And you may need to add:
if gameOver {
return
}
... in GameScene, where the gameplay is updated.
For more help, you should Google ray wenderlich uberjump part 2. There is good info and code in that tutorial about saving and displaying game scores.
Upvotes: 0
Reputation: 69
To load the highscore, you are going to need a int to hold the highscore, I'm not sure what you are trying to do with the highScoreLabel, but to load it you would do var highScore = defaults.integerForKey("highScore")
and for your label you can do highScoreLabel.text = "Score \(highScore)"
Upvotes: 0