我正在尝试编写各种各样的全局查找表。
我将游戏数据以字符/字符串格式存储在plist中,但在加载时需要采用整数/ id格式。
例如,在关卡数据文件中,“p”表示播放器。在游戏代码中,玩家被表示为整数1.这让我做一些按位操作等等。我在这里大大简化了,但试图明白这一点。此外,还有一个转换为精灵表上精灵的坐标。
现在,使用case语句在代码中的几个位置进行此字符串 - >整数,整数 - >字符串,整数 - >坐标等转换。当然,这很臭,我宁愿用字典查找来做。
我创建了一个名为levelInfo的类,并希望为此转换定义字典,然后在需要进行转换时调用类方法,或以其他方式处理级别数据。
NSString *levelObjects = @"empty,player,object,thing,doohickey";
int levelIDs[] = [0,1,2,4,8];
// etc etc
@implementation LevelInfo
+(int) crateIDfromChar: (char) crateChar {
int idx = [[crateTypes componentsSeparatedByString:@","] indexOfObject: crateChar];
return levelIDs[idx];
}
+(NSString *) crateStringFromID: (int) crateID {
return [[crateTypes componentsSeparatedByString:@","] objectAtIndex: crateID];
}
@end
有更好的方法吗?基本上构建这些临时数组或字典,或者每个调用进行此转换的任何内容都是错误的。我不知道如何声明一个常量的NSArray或NSDictionary。
请告诉我一个更好的方法......
答案 0 :(得分:13)
如果您希望数组可用于您班级中的所有代码,只需在@implementation
上下文之外声明它,然后在您的班级的+initialize
方法中初始化它。
NSArray *levelObjects;
@implementation LevelInfo
+ (void) initialize
{
if (!levelObjects)
levelObjects = [[NSArray alloc]
initWithObjects:@"empty",@"player",@"object",@"thing",@"doohickey",nil];
}
// now any other code in this file can use "levelObjects"
@end
答案 1 :(得分:3)
声明它static
所以它只需要创建一次。