一般情况下,游戏开发脚本文件是少不了的,瓦片地图的数组信息也可以存储在脚本文件中,例如:
OC语言NSArray的快速创建方式需要加前缀@,这一点无疑增加了铺地图的代码工作量.
这就会面临以下两点问题:
1.地图数据需要存储为文件
2.写地图数组每个value前都要加@
下面我们来解决这些问题.
本文demo功能:读取以txt为后缀的瓦片地图数组文件,并且数组写法简单.
demo未完善的功能:加入分关卡读取地图功能
demo代码水平:菜鸟
实现思路:
1.把在txt中输入地图数组,格式如:
{
1,2,3,0,1,2,3,4,
1,2,3,0,1,2,3,4,
1,2,3,0,1,2,3,4,
1,2,3,0,1,2,3,4,
}
(注意:本demo的地图数组为一维数组)
2.读取txt文件中的数据,转换成NSString格式;
3.依次判断NSString中单个字符是否为地图信息,并将地图信息转成NSNumber对象;
4.将所有的NSNumber对象存入NSArray;
5.处理NSArray(实现行列化)
重要代码片段:
1.读取txt文件,转换成NSArray:
#import "NSArray+ReadGameMapFromTxtCArray.h"
@implementation NSArray (ReadGameMapFromTxtCArray)
/**
* 获取地图数组
*
* @param path 文件路径
*
* @return 地图数组
*/
+ (NSArray *)gameMapWithFile:(NSString*)path {
NSString *map = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// NSLog(@"map= %@",map);
NSArray *array = [self getMapArray:map];
// NSLog(@"array = %@",array);
return array;
}
+ (NSArray *)getMapArray:(NSString*)mapStr{
NSMutableArray *array = [NSMutableArray array];
//字符串的索引
int index = 0;
while (1) {
//判断遍历字符串是够完成
if (index >= mapStr.length-1)break;
NSNumber *num = [self readString:mapStr withIndex:index];
if (num != nil) {
[array addObject:num];
}
index++;
}
return array;
}
/**
* 依次读取字符串中字符
*
* @param mapStr 从txt中读取的信息所得到的字符串
* @param index 记录字符串中索引
*
* @return OC数字对象
*/
+ (NSNumber*)readString:(NSString*)mapStr withIndex:(int)index{
NSRange range = {index,1};
NSString *sub = [mapStr substringWithRange:range];
//删除非数字信息
if ([sub isEqualToString:@"{"]) {
return nil;
}else if ([sub isEqualToString:@" "]) {
return nil;
}else if ([sub isEqualToString:@","]) {
return nil;
}else if ([sub isEqualToString:@"\n"]) {
return nil;
}else if ([sub isEqualToString:@"}"]) {
return nil;
}
// NSLog(@"sub%d = %@",index,sub);
int numInt = [sub intValue];
NSNumber *num = [NSNumber numberWithInt:numInt];
NSLog(@"numOC= %@",num);
return num;
}
@end
2.使用NSArray铺地图:
//铺地图
CGFloat btnWH = 20;
CGFloat margin = 3;
for (int i = 0;i < array.count; i++){
int row =i / 8 ;
int col = i % 8;
CGFloat btnX = 20+col*(btnWH+margin);
CGFloat btnY = 20+row*(btnWH+margin);
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(btnX, btnY, btnWH, btnWH)];
NSNumber *num = array[i];
// 设置btn颜色
int numInt = [num intValue];
if (numInt == kMapColorRed) {
btn.backgroundColor = [UIColor redColor];
}else if (numInt == kMapColorGray) {
btn.backgroundColor = [UIColor grayColor];
}
[self.view addSubview:btn];
(NSArray分类的名字有点恶心,见谅啊~)
(注释不多,如需交流请留言!)