`
浮生长恨
  • 浏览: 208447 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

游戏数据存储的四种常用方式(转)

阅读更多

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/513.html

 

OK,今天Himi介绍游戏存储这一块,在Android游戏开发中Himi介绍了好几种保存的方式和形式,那么在iOS中也有几种方式,一般常用的有以下四种形式:

       1.  NSKeyedArchiver(加密形式)

       2.  NSUserDefaults

       3.  Write写入方式

       4.  SQLite3

     这里Himi就不再介绍SQlite数据库了,Android游戏存储中我也介绍过SQLite如何保存数据,但是由于这一块很多童鞋没有接触过数据库相关知识,所以即使讲了也没作用,那么对于数据数据库的童鞋们可以参考其他博文或书籍进行学习;

      首先介绍第一种保存方式:NSKeyedArchiver

       代码很简单就不多解释了直接上代码: 

 

  1. //=================NSKeyedArchiver========================   
  2. NSString *saveStr1 = @"我是";  
  3. NSString *saveStr2 = @"数据";  
  4. NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];   
  5. //----Save  
  6. //这一句是将路径和文件名合成文件完整路径  
  7. NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];   
  8. NSString *filename = [Path stringByAppendingPathComponent:@"saveDatatest"];  
  9. [NSKeyedArchiver archiveRootObject:array toFile:filename];  
  10. //用于测试是否已经保存了数据  
  11. saveStr1 = @"hhhhhhiiii";  
  12. saveStr2 =@"mmmmmmiiii";   
  13. //----Load  
  14. array = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];  
  15. saveStr1 = [array objectAtIndex:0];  
  16. saveStr2 = [array objectAtIndex:1];   
  17. CCLOG(@"str:%@",saveStr1);  
  18. CCLOG(@"astr:%@",saveStr2);  

 

     首先介绍第二种保存方式:NSUserDefaults

代码很简单就不多解释了直接上代码:

 

  1. //=================NSUserDefaults========================  
  2. NSString *saveStr1 = @"我是";  
  3. NSString *saveStr2 = @"数据";  
  4. NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];           
  5. //Save  
  6. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];  
  7. [saveDefaults setObject:array forKey:@"SaveKey"];  
  8. //用于测试是否已经保存了数据  
  9. saveStr1 = @"hhhhhhiiii";  
  10. saveStr2 =@"mmmmmmiiii";    
  11. //---Load  
  12. array = [saveDefaults objectForKey:@"SaveKey"];  
  13. saveStr1 = [array objectAtIndex:0];  
  14. saveStr2 = [array objectAtIndex:1];  
  15. CCLOG(@"str:%@",saveStr1);  
  16. CCLOG(@"astr:%@",saveStr2);  

 

     首先介绍第三种保存方式:Write写入方式

代码很简单就不多解释了直接上代码:

  1. //=================Write写入方式========================  
  2. NSString *saveStr1 = @"我是";  
  3. NSString *saveStr2 = @"数据";  
  4. NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];   
  5. //----Save  
  6. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  7. NSString *documentsDirectory = [paths objectAtIndex:0];  
  8. if (!documentsDirectory) {  
  9.     NSLog(@"没找到");  
  10. }  
  11. NSMutableArray *saveDataArray=nil;  
  12. NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"Savedatas.plist"];  
  13. [[NSArray arrayWithObjects:array,nil] writeToFile:appFile atomically:NO];  
  14. //用于测试是否已经保存了数据  
  15. saveStr1 = @"hhhhhhiiii";  
  16. saveStr2 =@"mmmmmmiiii";    
  17. //----Load  
  18. if([[NSFileManager defaultManager] fileExistsAtPath:appFile]){  
  19.     saveDataArray = [NSMutableArray arrayWithContentsOfFile:appFile];      
  20. else{  
  21.     saveDataArray = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Savedatas" ofType:@"plist"]];  
  22. }  
  23. NSArray *strArray = [saveDataArray objectAtIndex:0];   
  24. saveStr1 = [strArray objectAtIndex:0];  
  25. saveStr2 = [strArray objectAtIndex:1];  
  26. CCLOG(@"str:%@",saveStr1);  
  27. CCLOG(@"astr:%@",saveStr2);   

 

不论哪种形式代码都很容易理解,那么以上三种保存方式代码中都带有如下两行代码;

  1. saveStr1 = @"hhhhhhiiii";  
  2. saveStr2 =@"mmmmmmiiii";   

我已经注释上了,为了验证是否保存数据成功,如果没有保存成功,最后打印的肯定就是hhhhhhiiiiiiiii,mmmmiiiii啦~正常保存的话如下图控制台信息:

 



      由于本章介绍过于简单,那么下面Himi对Write写入方式保存数据和读取数据封装了两个方法这里放出,给童鞋们行个方便:(其他两种大家封装起来风容易了,这里就不写了);

      封装的函数如下:

  1. //保存游戏数据  
  2. //参数介绍:  
  3. //   (NSMutableArray *)data :保存的数据  
  4. //   (NSString *)fileName :存储的文件名  
  5. -(BOOL) saveGameData:(NSMutableArray *)data  saveFileName:(NSString *)fileName  
  6. {  
  7.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  8.     NSString *documentsDirectory = [paths objectAtIndex:0];  
  9.     if (!documentsDirectory) {  
  10.         NSLog(@"Documents directory not found!");  
  11.         return NO;  
  12.     }  
  13.     NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];  
  14.     return ([data writeToFile:appFile atomically:YES]);  
  15. }  
  16. //读取游戏数据  
  17. //参数介绍:  
  18. //   (NSString *)fileName :需要读取数据的文件名  
  19. -(id) loadGameData:(NSString *)fileName  
  20. {  
  21.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  22.     NSString *documentsDirectory = [paths objectAtIndex:0];  
  23.     NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];  
  24.     NSMutableArray *myData = [[[NSMutableArray alloc] initWithContentsOfFile:appFile] autorelease];  
  25.     return myData;  
  26. }  

 

   使用代码如下:

 

  1. NSString *saveStr1 = @"测试保存读取";  
  2. NSString *saveStr2 = @"两个函数";  
  3. NSMutableArray *array = [NSMutableArray arrayWithObjects:saveStr1, saveStr2, nil];   
  4. [self saveGameData:array saveFileName:@"Himi"];  
  5. NSMutableArray*temp =(NSMutableArray*)[self loadGameData:@"Himi"];  
  6. CCLOG(@"%@--%@",[temp objectAtIndex:0],[temp objectAtIndex:1]);  

 

运行效果截图如下:

          


    这里Himi要提醒大家两点细节也是需要注意的地方:

   1.对于取出数据的时候需要注意,例如如下代码:

 

  1. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];   
  2. NSMutableArray *arraySaveData =[saveDefaults objectForKey:@"OhSaveData"];  
  3. //NSMutableArray *arraySaveData=[NSMutableArray arrayWithArray:[saveDefaults objectForKey:@"OhSaveData"]];  

 

   第二句代码是通过一个文件名获取你存储的数据,返回数据数组,但是!一定要注意这里返回的数据数组是不可修改的!及时你将读取的数据赋给一个可修改的数组中也一样无法修改其中的数据,所以如果你想将取出的数据进行修改那么这里需要要使用第三行代码来获取,这里Himi将获取出的数据数组首先copy给了可修改数组中,那么此时你的可修改数组就可以正常修改了!

   2.修改已经的存储文件;代码如下:

 

  1. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];   
  2. [saveDefaults setObject:arraySaveData forKey:@"已经存在的文件名"];  

arraySaveData:表示新的数据数组

 

         OK,本篇就介绍这里吧~继续忙了~

分享到:
评论

相关推荐

    Android四种数据存储的应用方式

    Android四种数据存储的应用方式  作为一个完整的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、文件存储、SQLite、 Content Provider。对这几种...

    unity学习笔记 unity shader unity数据存储方式 DoTween插件常用API

    unity学习笔记 unity shader unity数据存储方式 DoTween插件常用API

    Python程序设计:幸运转盘.pptx

    编写一个程序模拟幸运转盘,自动随机产生一等奖至五等奖,每个奖项对应的奖品用字典存储,每个奖品只有一个,奖品抽出以后只能在剩下的奖品中抽取,每次抽完需要输入获奖人的手机号码,所有奖品抽完游戏结束。...

    揭秘数据解密的关键技术

    《揭秘数据解密的关键技术》内容包含反汇编的阅读和理解,数据在计算机中的存储原理,常用媒体格式的解析,加密和解密的识别和分析,数据压缩的特征识别,打包文件格式的识别和游戏窗口化的方法。《揭秘数据解密的...

    揭秘数据解密的关键技术 CHM

    第1章 走进数据解密  1.1 数据解密是什么  1.1.1 代码逆向工程和数据逆向工程  1.2 数据解密的方法  1.2.1 黑盒分析法  1.2.2 白盒分析法 ...第8章 分析打包数据存储结构的模式 第9章 将游戏窗口化

    关于Oracle数据库各种存储形式的概述

    当大家安装Oracle的时候,如果选用了操作系统文件的存储形式,那么就会把Oracle的数据存储在操作系统中,以文件的形式存在。就好像我们玩某些单机版游戏,你的存档就是操作系统的文件一样。裸分区就是把数据库直接写...

    Java常用算法手册源代码

    2.1.5 数据结构的几种存储方式 2.1.6 数据类型 2.1.7 常用的数据结构 2.1.8 选择合适的数据结构解决实际问题 2.2 线性表 2.2.1 什么是线性表 2.2.2 线性表的基本运算 2.3 顺序表结构 2.3.1 准备数据 2.3.2 初始化...

    游戏开发项目-GameFrameworkProject.zip

    数据表 (Data Table) - 可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。 调试器 (Debugger) - 当游戏在 Unity 编辑器中运行或者以 ...

    数据结构与算法综合实验-连连看(whut)学知识还得靠自己

    了解 MFC 框架,包括 MFC Dialog 应用程序和 ...进一步掌握图的数据结构和应用,重点了解邻接矩阵的存储结构。 掌握图的常用算法,比如,深度优先遍历、图的联通判断等,能够利用图的算法实现游戏联通判断和胜负判断。

    【前端模板】065 游戏可视化大数据用户案例.zip

    数据存储技术:包括传统的关系型数据库(如MySQL、PostgreSQL)、NoSQL数据库(如MongoDB、Cassandra)以及数据湖(Data Lake)等存储技术。 数据可视化工具:如Tableau、Power BI、D3.js等,用于将数据转换为图表...

    微信小程序-微信小程序之24点计算游戏

    微信小程序之24点计算游戏 这是我第一次尝试用小程序开发的小游戏。 游戏难度分初、中、高三个等级,默认初级;每局游戏自动生成4个随机数(已经验证可算出...用到各种常用组件,数据存储、读取、判断、循环等知识点。

    unity游戏开发综合指南资源

    引擎与框架:介绍流行的游戏开发引擎和框架,如Unity和Unreal ...序列化:讲解数据序列化的重要性,以及如何在游戏开发中实现数据的存储和读取。 编辑器扩展:介绍如何定制和扩展游戏编辑器,以适应特定的开发需求

    IOS 数据存储详解及实例代码

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XML属性列表(plist)归档 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件...

    TAPTAP游戏评论的文本挖掘.zip

    数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫...

    Steam游戏库及社交关系爬虫.zip

    数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    2.1.5 数据结构的几种存储方式 18 2.1.6 数据类型 19 2.1.7 常用的数据结构 20 2.1.8 选择合适的数据结构解决实际问题 21 2.2 线性表 21 2.2.1 什么是线性表 21 2.2.2 线性表的基本运算 22 2.3 顺序表结构 ...

    米游社语音爬虫,可自动爬取原神和星穹铁道角色的语音文本、wav链接等信息。支持多语言。.zip

    数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫...

Global site tag (gtag.js) - Google Analytics