Cocos2d:没有读取plist文件

时间:2013-08-25 21:32:07

标签: ios objective-c exception cocos2d-iphone sigabrt

您好我正在制作一个cocos2d侧卷轴。我正在使用plist文件来提供我的游戏数据。由于某种原因,代码不读取plist文件,当我想显示图像,并且图像在plist文件中时,我收到SIGABRT错误。

以下是plist文件:enter image description here

这是导致错误的代码:

+(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");

1 个答案:

答案 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