应用UserDefaults储存游戏分数和最高分node
咱们在GameScene.swift里swift
private var currentScore:SKLabelNode! // 当前分数节点 private var cScore:Int = 0 /// Int 存当前分数 private var highScore:SKLabelNode! // 最高分数 private var hScore:Int = 0 /// Int 存最高分数
在子弹击中外星人时记录分数
func bulletHitAlien(nodeA:SKSpriteNode,nodeB:SKSpriteNode){}缓存
func bulletHitAlien(nodeA:SKSpriteNode,nodeB:SKSpriteNode){ // 分数统计 cScore += 1 currentScore.text = "SCORE:\(cScore)" // 保存当前分数 UserDefaults.standard.set(cScore, forKey: "CURRENTSCORE") if cScore > hScore { hScore = cScore highScore.text = "High:\(hScore)" // 保存最高分数 UserDefaults.standard.set(cScore, forKey: "HIGHSCORE") } }
咱们应用UserDefaults.standard.set方法,分别储存当前分数和最高分数对应的键值forKey:CURRENTSCORE和HIGHSCORE,而后,在游戏结束的场景LoseScene.swift经过UserDefaults.standard.integer(forKey: "CURRENTSCORE")取出存在手机沙盒里的值;网络
currentScore.text = "SCORE:\(UserDefaults.standard.integer(forKey: "CURRENTSCORE"))" // 取出当前分数 highScore.text = "HIGH SCORE:\(UserDefaults.standard.integer(forKey: "HIGHSCORE"))" // 取出沙盒中的最高分数
代码以下:app
private var currentScore:SKLabelNode! // 当局分数 private var highScore:SKLabelNode! // 最高分数 override func didMove(to view: SKView) { // 找到 名称为Play的节点 play = childNode(withName: "Play") as! SKSpriteNode currentScore = childNode(withName: "currentScore") as! SKLabelNode highScore = childNode(withName: "highScore") as! SKLabelNode currentScore.text = "SCORE:\(UserDefaults.standard.integer(forKey: "CURRENTSCORE"))" // 取出当前分数 highScore.text = "HIGH SCORE:\(UserDefaults.standard.integer(forKey: "HIGHSCORE"))" // 取出沙盒中的最高分数 }
咱们补充一下有关Swift数据储存方式的相关知识,数据储存是存在iOS沙盒的当中,沙盒,顾名思义,即各个app之间是没法互相访问数据的,其目录结构为:ide
每一个iOS应用都有本身的应用沙盒(应用沙盒就是文件系统目录),与其余文件系统隔离。应用必须待在本身的沙盒里,其余应用不能访问该沙盒。沙盒下的目录以下:spa
Documents: 保存应⽤运行时生成的须要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。code
tmp: 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用 没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。blog
Library/Caches: 保存应用运行时⽣成的须要持久化的数据,iTunes同步设备时不会备份 该目录。⼀通常存储体积大、不须要备份的非重要数据,好比网络数据缓存存储到Caches下。游戏
Library/Preference: 保存应用的全部偏好设置,如iOS的Settings(设置) 应⽤会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录。
UserDefaults能够存储的数据类型:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary,若是把有null的value放入userDefaults,程序会崩。
//存储基础类型,以Int为例。 UserDefaults.standard.set(15, forKey:"theKey") //读取基础类型,以Int为例。 let num = UserDefaults.standard.integer(forKey: "theKey")
注意:不要用UserDefaults储存用户的密码。
补充单例实现存取UserDefaults方法:
// // GameHelper.swift // SpaceBattle // Copyright © 2018 iFiero. All rights reserved. // import Foundation public let bestScoreKey:String = "BEST_SCORE" public let currScoreKey:String = "CURR_SCORE" class GameHelper:NSObject { static let shared:GameHelper = GameHelper() // 建立单例 private override init(){ } // 存取游戏分数 func setScore(score:Int,scoreKey:String){ //UserDefaults来取当前得分 UserDefaults.standard.set(score, forKey: scoreKey) //沙盒 UserDefaults.standard.synchronize() // 同步 } func getScore(scoreKey:String) -> Int { return UserDefaults.standard.integer(forKey: scoreKey) } }
单例实现存取UserDefaults方法的源码传送门:http://www.iFIERO.com/uploads/SpaceBattle_Score.zip
更多游戏教学:http://www.iFIERO.com