李华明Himi 原创,转载务必在明显处注明
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. "没找到");
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. "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. "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给了可修改数组中,那么此时你的可修改数组就可以正常修改了!
修改已经的存储文件;代码如下:
1. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
2. [saveDefaults setObject:arraySaveData forKey:@"已经存在的文件名"];
arraySaveData:表示新的数据数组
OK,本篇就介绍这里吧~继续忙了~