在swift spriteKit中使用NSUserDefault在新场景中显示高分
我正在用SpriteKit做一个游戏,它保存了玩家的高分。当游戏结束时,它会过渡到另一个场景(结束场景)。我搞不懂如何在最后一幕中显示高分。我的高分代码:在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
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。该教程中有关于保存和显示游戏分数的好信息和代码。该答案可能重复,当我尝试使用它时会出现错误,我想我在寻找不同的答案