Cocos2d: не читает файл plist

Здравствуйте, я делаю боковую прокрутку 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");

person PoKoBros    schedule 25.08.2013    source источник
comment
поместите несколько точек останова в свой код и убедитесь, что содержимое словаря, которое вы передаете своему методу инициализации, соответствует вашим ожиданиям.   -  person Kreiri    schedule 26.08.2013
comment
Я хочу иметь имя файла изображения спрайта красного врага, который хранится в ключе словаря RedEnemyBaseImage, но он сказал, что в моем файле ресурсов нет файла, соответствующего этому имени файла. Я проверил, и у меня есть фотография с таким же названием. Это также проблема для главного героя моего приложения, я пытаюсь сделать это тем же методом, который я использую для красного врага со словарем и файлом plist.   -  person PoKoBros    schedule 26.08.2013


Ответы (1)


Сделайте свою жизнь проще, оптимизировав код для удобочитаемости (это также означает «логарифмичность»). Вместо этого:

redEnemySprite = [CCSprite spriteWithFile:
    [redEnemyDictionary objectForKey:@"RedEnemyBaseImage"]];

Перепишите следующим образом:

NSString* img = [redEnemyDictionary objectForKey:@"RedEnemyBaseImage"];
NSLog(@"using image file: %@", img);
redEnemySprite = [CCSprite spriteWithFile:img];

Дополнительная временная переменная img позволяет вам проверять содержимое переменной img, когда вы устанавливаете точку останова отладки, и, по совпадению, вы также можете регистрировать ее.

Если вы это регистрируете ноль, проверьте словарь, зарегистрировав его:

NSLog(@"dict: %@", redEnemyDictionary);

Распространенной ошибкой во вложенных словарных структурах является забывание проиндексировать вложенный путь в словаре. Т.е. вышеприведенный список представляет собой словарь, содержащий ключ «Символы», который является другим словарем, чей ключ «RedEnemy» содержит другой словарь со строками. Если вы забудете только один из ключей или сделаете опечатку, возвращаемый объект будет нулевым, как и все последующие обращения к словарю «nil object».

Этот материал легко отлаживать, если вы знаете, как устанавливать точки останова, выполнять пошаговый код и проверять переменные в отладчике. Если вы не знакомы с этими процессами, вам следует прочитать Руководство по отладке Xcode.

person LearnCocos2D    schedule 26.08.2013