使用 Swift 在 Sprite Kit 游戏中重置高分
Reset a high score in a Sprite Kit game using Swift
我正在尝试重置我在 Sprite Kit 游戏中的高分,但遇到了一些问题。
现在,我可以将 HUD 中的标签重置为零,但是当游戏再次开始时,标签中的分数会跳回到之前的位置,因为它们存储在 NSUserDefaults 中。
我正在像这样重置标签:
override func didMoveToView(view: SKView) {
lblCoins.text = "0"
lblScore.text = "0"
}
我正在尝试像这样重置 NSUserDefaults:
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "highScore")
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
我试过将此代码块放置在游戏中的任何位置,但似乎无法重置分数。只有当我完全重置应用程序时,分数才会重置。
以下是我尝试放置的一些函数:
override func didMoveToView(view: SKView) {
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "highScore")
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
}
在 GameOver 中:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
...
case is GameOver:
let newScene = GameScene(fileNamed:"GameScene")
newScene!.scaleMode = .AspectFill
let reveal = SKTransition.flipHorizontalWithDuration(0.5)
self.view?.presentScene(newScene!, transition: reveal)
self.saveHighScore("com.prismstudios.jumpingcarl.leaderboard", score: GameState.sharedInstance.highScore)
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "highScore")
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
default:
break
}
}
这是我在 GameScene 中添加点的位置:
func didBeginContact(contact: SKPhysicsContact) {
GameState.sharedInstance.highScore += 10
lblScore.text = String(format: "%d", GameState.sharedInstance.highScore)
GameState.sharedInstance.coins += 1
lblCoins.text = String(format: "%d", GameState.sharedInstance.coins)
}
游戏状态class:
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)
// 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
}
}
有人可以帮忙吗?
如果你想重置一切,试试这个:
let defaults = `NSUserDefaults`.standardUserDefaults()
let appDomain: NSString = NSBundle.mainBundle().bundleIdentifier!
defaults.removePersistentDomainForName(appDomain as String)
如果你只是想重置你的高分,你必须选择正确的 "one"。如果你正在制作这样的东西:
defaults.setValue(123, forKey: "Highscore")
defaults.synchronize()
然后
defaults.setValue(0, forKey: "Highscore")
defaults.synchronize()
你有类似数组的东西:
Highscore1 = defaults.objectForKey("Highscore")![0] as? Int //123
Highscore2 = defaults.objectForKey("Highscore")![1] as? Int //0
您只是在添加更多高分...试试这样的操作:
func resetHighscore(){
let defaults = `NSUserDefaults`.standardUserDefaults()
defaults.removeObjectForKey("Highscore")
defaults.setValue(0, forKey: "Highscore")
defaults.synchronize()
}
好的,我明白了。
之后,我 post 将分数添加到 Game Center,然后我添加 GameState.sharedInstance.highScore = 0
:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
switch gameState.currentState {
...
case is GameOver:
let newScene = GameScene(fileNamed:"GameScene")
newScene!.scaleMode = .AspectFill
let reveal = SKTransition.flipHorizontalWithDuration(0.5)
self.view?.presentScene(newScene!, transition: reveal)
// Save high score to Game Center
self.saveHighScore("com.prismstudios.jumpingcarl.leaderboard", score: GameState.sharedInstance.highScore)
// Reset score and coins collected back to zero
GameState.sharedInstance.highScore = 0
GameState.sharedInstance.coins = 0
default:
break
}
}
我不太确定为什么它以这种方式工作并且 NSUserDefaults 失败,但我知道这与我有一个 GameState 助手有关 class.
我正在尝试重置我在 Sprite Kit 游戏中的高分,但遇到了一些问题。
现在,我可以将 HUD 中的标签重置为零,但是当游戏再次开始时,标签中的分数会跳回到之前的位置,因为它们存储在 NSUserDefaults 中。
我正在像这样重置标签:
override func didMoveToView(view: SKView) {
lblCoins.text = "0"
lblScore.text = "0"
}
我正在尝试像这样重置 NSUserDefaults:
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "highScore")
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
我试过将此代码块放置在游戏中的任何位置,但似乎无法重置分数。只有当我完全重置应用程序时,分数才会重置。
以下是我尝试放置的一些函数:
override func didMoveToView(view: SKView) {
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "highScore")
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
}
在 GameOver 中:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
...
case is GameOver:
let newScene = GameScene(fileNamed:"GameScene")
newScene!.scaleMode = .AspectFill
let reveal = SKTransition.flipHorizontalWithDuration(0.5)
self.view?.presentScene(newScene!, transition: reveal)
self.saveHighScore("com.prismstudios.jumpingcarl.leaderboard", score: GameState.sharedInstance.highScore)
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "highScore")
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
default:
break
}
}
这是我在 GameScene 中添加点的位置:
func didBeginContact(contact: SKPhysicsContact) {
GameState.sharedInstance.highScore += 10
lblScore.text = String(format: "%d", GameState.sharedInstance.highScore)
GameState.sharedInstance.coins += 1
lblCoins.text = String(format: "%d", GameState.sharedInstance.coins)
}
游戏状态class:
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)
// 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
}
}
有人可以帮忙吗?
如果你想重置一切,试试这个:
let defaults = `NSUserDefaults`.standardUserDefaults()
let appDomain: NSString = NSBundle.mainBundle().bundleIdentifier!
defaults.removePersistentDomainForName(appDomain as String)
如果你只是想重置你的高分,你必须选择正确的 "one"。如果你正在制作这样的东西:
defaults.setValue(123, forKey: "Highscore")
defaults.synchronize()
然后
defaults.setValue(0, forKey: "Highscore")
defaults.synchronize()
你有类似数组的东西:
Highscore1 = defaults.objectForKey("Highscore")![0] as? Int //123
Highscore2 = defaults.objectForKey("Highscore")![1] as? Int //0
您只是在添加更多高分...试试这样的操作:
func resetHighscore(){
let defaults = `NSUserDefaults`.standardUserDefaults()
defaults.removeObjectForKey("Highscore")
defaults.setValue(0, forKey: "Highscore")
defaults.synchronize()
}
好的,我明白了。
之后,我 post 将分数添加到 Game Center,然后我添加 GameState.sharedInstance.highScore = 0
:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
switch gameState.currentState {
...
case is GameOver:
let newScene = GameScene(fileNamed:"GameScene")
newScene!.scaleMode = .AspectFill
let reveal = SKTransition.flipHorizontalWithDuration(0.5)
self.view?.presentScene(newScene!, transition: reveal)
// Save high score to Game Center
self.saveHighScore("com.prismstudios.jumpingcarl.leaderboard", score: GameState.sharedInstance.highScore)
// Reset score and coins collected back to zero
GameState.sharedInstance.highScore = 0
GameState.sharedInstance.coins = 0
default:
break
}
}
我不太确定为什么它以这种方式工作并且 NSUserDefaults 失败,但我知道这与我有一个 GameState 助手有关 class.