应用UserDefaults储存游戏分数和最高分

我们在GameScene.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"))" // 取出沙盒中的最高分数

取出沙盒中的分数,并分别把当前分数、最高分数显示在LoseScene场景当中

代码如下:

 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之间是无法互相访问数据的,其目录结构为:

每个应用程序都有对应的私有目录,其根目录为Home目录。该目录下又三个文件夹:Documents、Library、tmp

UserDefaults的存放位置

每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒。沙盒下的目录如下:

Documents: 保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。

tmp: 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用 没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。

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

最新文章

  1. ldap部署相关,ldap双机\LAM配置管理\ldap备份还原
  2. 使用Echarts实现动态曲线图表
  3. CentOS RedHat YUM 源扩展补充(32位、64位均有)
  4. oo智慧
  5. TabHost 两种使用方法 直接让一个Activity 继承TabActivity 和 利用findViwById()方法取得TagHost组件
  6. mybatis0204 一对多查询
  7. 2.Android Studio系列教程2——基本设置与运行
  8. 不同服务器之间使用svn钩子post-commit同步代码遇到的证书认证问题.md
  9. 【百度地图API】如何制作多途经点的线路导航——驾车篇
  10. noip提高组2011 Mayan游戏
  11. Tabhost最纯净的实现方式
  12. 对于JavaBean+Servlet+SqlServer的代码总结和打包调用
  13. Keep-Alive 是什么?
  14. bootstrap表格鼠标悬停与状态类
  15. 杭电多校第四场 E Matrix from Arrays
  16. PHP操作Redis常用技巧
  17. python通讯录系统
  18. (转)powerdesigner 生成sql脚本使用的设置
  19. Verilog三段式状态机描述
  20. SQLSERVER 创建索引实现代码

热门文章

  1. Ajax同时上传表单序列化参数+自定义参数
  2. WIN10下的Docker安装
  3. 使用Spring实现AOP(XML+注解)
  4. torch.backend.cudnn.benchmark
  5. PAT——1007. 素数对猜想
  6. java连接linux的三种方式(附执行命令)
  7. Python 学习笔记(九)Python元组和字典(一)
  8. php auto_prepend_file和auto_append_file的妙用
  9. About Me - 关于
  10. wps for linux 安装后系统缺失字体安装配置