您好我正在制作一个cocos2d侧卷轴。我正在使用plist文件来提供我的游戏数据。由于某种原因,代码不读取plist文件,当我想显示图像,并且图像在plist文件中时,我收到SIGABRT错误。
以下是plist文件:
这是导致错误的代码:
+(id)createRedEnemyWithDictionary:(NSDictionary *)redEnemyDictionary{
return [[[self alloc]initWithDictionary:(NSDictionary*)redEnemyDictionary]autorelease];
}
-(id)initWithDictionary:(NSDictionary*)redEnemyDictionary{
if ((self = [super init])) {
//Make the redEnemy
redEnemySprite = [CCSprite spriteWithFile:[redEnemyDictionary objectForKey:@"RedEnemyBaseImage"]];
[self addChild:redEnemySprite];
这是我得到的错误:
***断言失败 - [CCSprite initWithFile:]
这是我的异常断点指向的代码行:
NSAssert(filename != nil, @"Invalid filename for sprite");
答案 0 :(得分:0)
通过优化代码以提高可读性(这也意味着“可记录性”),让您的工作更轻松。而不是:
redEnemySprite = [CCSprite spriteWithFile:
[redEnemyDictionary objectForKey:@"RedEnemyBaseImage"]];
重写如下:
NSString* img = [redEnemyDictionary objectForKey:@"RedEnemyBaseImage"];
NSLog(@"using image file: %@", img);
redEnemySprite = [CCSprite spriteWithFile:img];
额外的临时变量img
允许您在设置调试断点时检查img
变量的内容,巧合的是,您也可以记录它。
如果您记录为nil,请通过记录来检查词典:
NSLog(@"dict: %@", redEnemyDictionary);
嵌套字典结构中的一个常见错误是忘记索引字典中的子路径。即上面的plist是一个字典,其中包含一个键“Characters”,这是另一个字典,其“RedEnemy”键包含另一个带字符串的字典。如果您只忘记其中一个键或输入错误,则返回的对象将为nil,所有后续访问都将为“nil object”字典。
如果你知道如何在调试器中设置断点,单步执行代码和检查变量,那么这个东西很容易调试。如果您不熟悉这些流程,请阅读Xcode debugging guide。