`
浮生长恨
  • 浏览: 212690 次
  • 性别: 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,本篇就介绍这里吧~继续忙了~

分享到:
评论

相关推荐

    游戏开发常用数据结构和算法

    【游戏开发常用数据结构和算法】这一主题涵盖了在Java编程中用于游戏开发的重要概念,主要集中在数据结构和算法的应用上。在游戏开发中,高效的数据结构和算法选择能够显著提升程序性能,降低内存消耗,从而优化游戏...

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

    在这个“unity学习笔记”中,我们将深入探讨Unity中的Shader编程、数据存储方法和DoTween插件的常用API。 Unity Shader是控制游戏图形表现的关键元素,它们允许开发者定制游戏的视觉效果,比如光照、纹理和粒子效果...

    游戏开发常用算法

    ### 游戏开发常用算法详解 #### 一、算法与数据结构基础 在游戏开发过程中,算法和数据结构是至关重要的。算法是指解决问题的一系列步骤,而数据结构则是组织和管理数据的方式。良好的算法和数据结构能够提高游戏...

    AS游戏设计常用数据结构

    本文将深入探讨AS(ActionScript)游戏设计中常用的数据结构,并结合标签中的"源码"和"工具",介绍如何利用这些数据结构优化游戏开发。 首先,数组是最基础的数据结构,用于存储一组有序的元素。在AS中,我们可以...

    游戏空间数据结构

    在游戏开发中,空间数据结构是一种至关重要的概念,它涉及到如何高效地存储和管理游戏世界中的对象位置、形状以及它们之间的关系。空间数据结构优化了游戏的性能,减少了计算复杂性,使得游戏运行更加流畅。这里我们...

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

    Android系统提供了四种主要的数据存储方式,每种都有其特定的适用场景和优缺点。 首先,`SharedPreferences`是Android中用于存储轻量级配置数据的方式。它基于XML文件,存储键值对数据,通常用于保存应用程序的用户...

    网络游戏-网络卷创建方法、数据存储方法、存储设备和存储系统.zip

    数据存储方法则涉及到如何有效地保存和检索游戏数据。网络游戏通常采用关系型数据库(如MySQL)、非关系型数据库(如MongoDB)或分布式数据库系统(如HBase)来存储数据。游戏中的实时数据,如玩家状态、交易记录等...

    游戏开发中常用的数据结构浅析.pdf

    数组和链表提供了高效的数据存储和访问,而栈和队列则为处理后进先出和先进先出的任务提供了便利。树结构在处理层次化和分类信息时展现出强大的优势。游戏开发者需要深刻理解这些数据结构的特点和适用场景,从而在...

    几个常用的三维点云数据包括txt,pcd,ply,obj格式

    1. **TXT格式**:这是最基础的数据存储格式,通常包含每一行都有三个数值(X, Y, Z)的文本文件,分别代表点在三维空间的坐标。TXT文件易于生成和读取,但不包含任何附加信息,如颜色、法线向量或元数据。因此,当...

    网络游戏-数据存储、读取、传输方法和管理服务器及网络节点.zip

    常用的数据存储方式有关系型数据库(如MySQL)、非关系型数据库(如MongoDB)和云存储服务(如Amazon S3)。游戏开发团队会根据数据的结构和访问模式选择合适的存储方案,同时考虑数据备份和恢复策略,以防止数据...

    网络游戏-一种网络存储服务器及其缓存数据的方法.zip

    网络游戏是当今互联网时代的一种热门应用,它涉及到众多的技术领域,如网络通信、数据存储、分布式系统等。在本文中,我们将深入探讨标题所提及的“一种网络存储服务器及其缓存数据的方法”,这与网络游戏的高效运行...

    网络游戏-本地数据网络存储系统及方法.zip

    1. 数据库管理系统:这是存储和管理游戏数据的核心工具。常见的数据库系统有SQL(如MySQL、SQLite)和NoSQL(如MongoDB)。SQL数据库适合结构化数据,而NoSQL则更适合非结构化或半结构化的数据。 2. 数据缓存:为了...

    将raw的数据转换为bmp图像

    BMP是Windows操作系统中的一种位图文件格式,它存储的是未经压缩的像素数据。BMP文件的头部包含了一些元信息,如图像的宽度、高度、色彩深度等,这些信息对于正确解析图像至关重要。当我们将RAW数据转换为BMP时,...

    迷宫游戏-数据结构

    在这个“迷宫游戏-数据结构”的项目中,我们可以深入探讨几种常用的数据结构以及它们在构建和解决迷宫问题时的应用。 首先,迷宫可以被抽象为一个图或矩阵来表示。在二维矩阵中,每个元素代表迷宫的一个位置,1通常...

    游戏开发中常用的点阵字库应用

    点阵字库在游戏开发中的应用广泛且至关重要,它是一种基于像素网格的字体表示方式,尤其在低分辨率或复古风格的游戏中占据主导地位。点阵字库通过将每个字符设计成一个二维的像素阵列来形成文字,这些阵列按照特定的...

    数据中台建设四步方法论:采、存、通、用(1201).pptx

    - 数据存储层:用于存储各类业务数据。 - 服务中心:如交易中心、用户中心等。 ##### 1.1.3 什么是数据中台? - **定义**:数据中台专注于数据的处理、分析和应用,为业务决策提供数据支持。 - **架构示例**: ...

    Flash中数据的存储和读取

    Flash提供了多种方式来实现数据的持久化,其中最常用的是通过使用`SharedObject`类。`SharedObject`类允许你在用户的本地硬盘上存储小量的数据,类似于浏览器的Cookie,但容量更大,可以达到100KB(根据用户设置可能...

    网络游戏-网络存储设备及其提高数据存取速度的方法.zip

    通过将游戏数据备份至云端,游戏开发者可以实现数据的远程备份、灾备恢复,同时利用云服务商的全局负载均衡技术,确保玩家在全球范围内都能快速访问游戏资源。 2. 分布式存储系统:如Hadoop HDFS、Ceph等,通过...

Global site tag (gtag.js) - Google Analytics