本站文章均为 李华明Himi 原创,转载务必在明显处注明:

转载自【黑米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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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

 第二种保存方式:NSUserDefaults

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//=================NSUserDefaults========================  
NSString *saveStr1 = @"我是";  
NSString *saveStr2 = @"数据";  
NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];          
//Save  
NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];  
[saveDefaults setObject:array forKey:@"SaveKey"];  
//用于测试是否已经保存了数据  
saveStr1 = @"hhhhhhiiii";  
saveStr2 =@"mmmmmmiiii";    
//---Load  
array = [saveDefaults objectForKey:@"SaveKey"];  
saveStr1 = [array objectAtIndex:0];  
saveStr2 = [array objectAtIndex:1];  
CCLOG(@"str:%@",saveStr1);  
CCLOG(@"astr:%@",saveStr2);

第三种保存方式:Write写入方式

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

//=================Write写入方式========================  
NSString *saveStr1 = @"我是";  
NSString *saveStr2 = @"数据";  
NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];  
//----Save  
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *documentsDirectory = [paths objectAtIndex:0];  
if (!documentsDirectory) {  
    NSLog(@"没找到");  
}  
NSMutableArray *saveDataArray=nil;  
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"Savedatas.plist"];  
[[NSArray arrayWithObjects:array,nil] writeToFile:appFile atomically:NO];  
//用于测试是否已经保存了数据  
saveStr1 = @"hhhhhhiiii";  
saveStr2 =@"mmmmmmiiii";    
//----Load  
if([[NSFileManager defaultManager] fileExistsAtPath:appFile]){  
    saveDataArray = [NSMutableArray arrayWithContentsOfFile:appFile];      
} else{  
    saveDataArray = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Savedatas" ofType:@"plist"]];  
}  
NSArray *strArray = [saveDataArray objectAtIndex:0];  
saveStr1 = [strArray objectAtIndex:0];  
saveStr2 = [strArray objectAtIndex:1];  
CCLOG(@"str:%@",saveStr1);  
CCLOG(@"astr:%@",saveStr2);

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

1
2

saveStr1 = @"hhhhhhiiii";  
saveStr2 =@"mmmmmmiiii";

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

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

封装的函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

//保存游戏数据  
//参数介绍:  
//   (NSMutableArray *)data :保存的数据  
//   (NSString *)fileName :存储的文件名  
-(BOOL) saveGameData:(NSMutableArray *)data  saveFileName:(NSString *)fileName  
{  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSString *documentsDirectory = [paths objectAtIndex:0];  
    if (!documentsDirectory) {  
        NSLog(@"Documents directory not found!");  
        return NO;  
    }  
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];  
    return ([data writeToFile:appFile atomically:YES]);  
}  
//读取游戏数据  
//参数介绍:  
//   (NSString *)fileName :需要读取数据的文件名  
-(id) loadGameData:(NSString *)fileName  
{  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSString *documentsDirectory = [paths objectAtIndex:0];  
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];  
    NSMutableArray *myData = [[[NSMutableArray alloc] initWithContentsOfFile:appFile] autorelease];  
    return myData;  
}

使用代码如下:

1
2
3
4
5
6

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

运行效果截图如下:

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

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

1
2
3

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

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

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

1
2

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

arraySaveData:表示新的数据数组;

【IOS-COCOS2D游戏开发之十九】游戏数据存储的四种常用方式NSKEYEDARCHIVER/NSUSERDEFAULTS/WRITE写入/SQLITE3...相关推荐

  1. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第十九讲:apache+php+mysql开发环境搭建(wamp)

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第十九讲:apache+php+mysql开发环境搭建(wamp) window环境下进行网站建设时,必须要进行wamp环境的搭建.本文介绍了如果配置apac ...

  2. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  3. 【转】【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    原文连接:http://www.cnblogs.com/dyllove98/archive/2012/04/07/2461865.html#commentform 我们常常听闻AI(Artificia ...

  4. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI .

    本系列文章由zhmxy555编写,转载请注明出处.  http://blog.csdn.net/zhmxy555/article/details/7434317 作者:毛星云    邮箱: happy ...

  5. [原]【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    本系列文章由zhmxy555编写,转载请注明出处.  http://blog.csdn.net/zhmxy555/article/details/7434317 作者:毛星云    邮箱: happy ...

  6. 游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    我们常常听闻AI(Artificial Intelligence人工智能)这个名词,比如Dota里面的AI地图.写这篇文章的时候,最新版的Dota AI是6.72f,估计过几天6.73的AI也要出来了 ...

  7. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

  8. Android开发之入门基础篇--拨号器的四种实现方式

    整理之前的学习笔记,发现了很多在学习Android基础的过程中的一些很适合一些新手开发的代码,想想之前也是一步一个脚印,一行一行的代码敲出来的,虽然这些代码很简单,但是里面的编程思路却是很有学习意义的 ...

  9. 【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈

    From: http://blog.csdn.net/zhmxy555/article/details/7522960 本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://bl ...

最新文章

  1. android源码模块编译错误,Android 源码编译错误记录
  2. 【剑指offer-Java版】40数组中只出现一次的数字
  3. 037_Unicode对照表三
  4. 启动Eclipse时,启不起来JVM terminated. Exit code=-1
  5. F. Paper Grading(Trie树+dfs序+二维数点)
  6. 字典中文乱码怎么处理_CATIA教程技巧和二次开发宏:我的零件有很多的几何体,但是几何体的名称是乱的,还有乱码,影响我的后续操作,我该怎么处理?...
  7. C#中字符与字符串(转)
  8. 重定向和请求转发后面加“return;”语句
  9. 超标量处理器设计 姚永斌 第1章 超标量处理器概览 摘录
  10. python编辑数学公式_最好用的文字与公式编辑器,这套数学笔记神器送给你
  11. 带有en的单词有哪些_英语前缀大全en:开头是EN的单词有哪些
  12. fastlane php,fastlane 自动化打包不同的target,以及手动传版本号参数
  13. 苹果零售店十大秘诀:禁止纠正顾客发音错误
  14. 表格进阶03—出纳日报表(表格,再次练习)
  15. 从0到1:CTFer成长之路docker环境搭建
  16. 中国移动光猫H2-3拨号模式和bridge(桥)模式
  17. 漫谈递归——递归需要满足的两个条件
  18. 思科ASA防火墙:内网telnet远程控制防火墙 外网ssh远程控制防火墙
  19. 串口通信——串口uart
  20. 细粒度控制Grails程序的日志输出

热门文章

  1. iOS10 Safari不识别viewport禁用缩放的暴力解决方案
  2. JavaSE学习总结(八)—— 异常处理(Exception)
  3. [课后作业] 第032讲:异常处理:你不可能总是对的
  4. Linux系统centos7+VMwareWorkstation创建共享文件夹错误解决方法集锦
  5. WIN10系统和压缩内存占用磁盘过高的解决方案(亲测有效)
  6. HTML5 Canvas vs. SVG vs. div
  7. 为什么文本文件以换行符结尾?
  8. windows oracle .msb not found,oracle安装, Message file sp1lang.msb not found
  9. mysql怎么约束_MySQL 约束详解
  10. STM32:堆和栈(Heap Stack)及SRAM存储使用