注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

没有你的天堂

Cobra'Nails' Blog.

 
 
 

日志

 
 

NSData读取和保存数据  

2011-01-02 15:02:00|  分类: objective-c |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在游戏的开发中,遇到一个小问题:如何保存和读取游戏数据?目前,还只是地图数据。

我已经知道的就是fopen,fclose,fwrite之类标准的读写方法,这个是可以用的,但是文件路径要自己处理。

作为一名合格的懒人,自己手动处理文件路径这种方法是不可以接受的。

NSArray也提供了一些方法直写文件,我用了,结果就是bus error。

NSData貌似是可以用的,放狗搜索了一阵子,这个问题算是解决了。

直接从项目里复制的代码(这是写的):

NSMutableData*data = [[NSMutableDataalloc]init];

[dataappendBytes:identifierlength:sizeof(char)*6];

[dataappendBytes:sizelength:sizeof(int)*3];

for(j=0;j<256;j++){

[dataappendBytes:mapdata[j]length:sizeof(unsigned char)*256];

//mapdata

}

for(j=0;j<256;j++){

[dataappendBytes:groupdata[j]length:sizeof(unsigned char)*256];

//groupdata

}

[dataappendBytes:boundlength:sizeof(cBound)*k];

for(t=1;t<k;t++){

intcount = [[pathgroupobjectAtIndex:t]count];

NSMutableArray*path = [pathgroupobjectAtIndex:t];

[dataappendBytes:&countlength:sizeof(int)];

//obstacle path

cPoint*cpath = (cPoint*)malloc(sizeof(cPoint)*count);

intm;

for(m=0;m<count;m++){

IntPoint*ip = [pathobjectAtIndex:m];

cpath[m] = ip.p;

}

[dataappendBytes:cpathlength:sizeof(cPoint)*m];

//obstacle path point

}

[datawriteToFile:@"testmap_data.world"atomically:YES];


然后是读的:



NSString*filePath = [[NSBundlemainBundle]pathForResource:@"testmap_data"ofType:@"world"];  

NSMutableData * data = [NSData dataWithContentsOfFile:filePath];

char *identifier = malloc(sizeof(char)*7);

int locator0 = sizeof(char)*6;

[data getBytes:identifier range:NSMakeRange(0, sizeof(char)*7)];

int locator_size = 6;

int *mapsizeinfo = malloc(sizeof(int)*3);

[data getBytes:mapsizeinfo range:NSMakeRange(locator_size, 3*sizeof(int))];

obstacle_group_count= mapsizeinfo[2];

int locator_mapdata = locator_size+3*sizeof(int);

int locator_tmp = locator_mapdata;

for (i=0; i<mapsizeinfo[1]; i++) {

[data getBytes:logicStaticMap[i] range:NSMakeRange(locator_tmp, mapsizeinfo[0]*sizeof(unsigned char))];

locator_tmp+=mapsizeinfo[0]*sizeof(unsigned char);

}

int locator_groupdata = locator_mapdata+mapsizeinfo[0]*mapsizeinfo[1]*sizeof(unsigned char);

locator_tmp = locator_groupdata;

for (i=0; i<mapsizeinfo[1]; i++) {

[data getBytes:logicStaticObstacleGroup[i] range:NSMakeRange(locator_tmp, mapsizeinfo[0]*sizeof(unsigned char))];

locator_tmp+=mapsizeinfo[0]*sizeof(unsigned char);

}

int locator_bound = locator_groupdata+mapsizeinfo[0]*mapsizeinfo[1]*sizeof(unsigned char);

obstacle_bound=malloc(sizeof(RAObstacleBound)*mapsizeinfo[2]);

[data getBytes:obstacle_bound range:NSMakeRange(locator_bound, mapsizeinfo[2]*sizeof(RAObstacleBound))];

int locator_obpath = locator_bound+mapsizeinfo[2]*sizeof(RAObstacleBound);

locator_tmp = locator_obpath;

obstacle_path = malloc(sizeof(RAPoint *)*mapsizeinfo[2]);

ob_path_count = malloc(sizeof(int)*mapsizeinfo[2]);

for (i=1; i<mapsizeinfo[2]; i++) {

[data getBytes:ob_path_count+i range:NSMakeRange(locator_tmp, sizeof(int))];

locator_tmp+=sizeof(int);

obstacle_path[i] =malloc(sizeof(RAPoint)*ob_path_count[i]);

[data getBytes:obstacle_path[i] range:NSMakeRange(locator_tmp, sizeof(RAPoint)*ob_path_count[i])];

locator_tmp+=sizeof(RAPoint)*ob_path_count[i];

}

这里还有一些问题,首先就是路径问题,用这样的方法可以直接获取Resource目录里的文件,非常方便,不用再自己处理,这里是读取testmap_data.world,文件名是分成了2部分。

NSString*filePath = [[NSBundlemainBundle]pathForResource:@"testmap_data"ofType:@"world"];  

NSMutableData * data = [NSData dataWithContentsOfFile:filePath];

第二个问题是,读取的顺序。

NSData总是从文件头开始读取,所以要使用NSRange作为一个范围,到底是哪个范围,需要自己计算。

效率上肯定不如fwrite。

  评论这张
 
阅读(4)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017