Cocos2d: ошибка SIGABRT со спрайт-листами

Здравствуйте, я делаю боковой скроллер cocos2d. Мне нужно использовать лист спрайтов для моей игры, и когда я его использую, он выдает ошибку SIGABRT. Я использовал точку останова исключения, чтобы увидеть точную строку кода, вызывающую проблему, и получил эту строку:

NSAssert(spriteFrame!=nil, @"Invalid spriteFrame for sprite");

Результат:

2013-08-24 15: 51: 28.410 Приложение [2171: a0b] имя таблицы спрайтов - characterssheet_poses 24.08.2013 15: 51: 28.419 Приложение [2171: a0b] bruisedImage = (null) 24.08.2013 15:51 : 28.420 Приложение [2171: a0b] cocos2d: CCSpriteFrameCache: Frame '(null)' не найден 24.08.2013 15: 51: 28.420 Приложение [2171: a0b] bruisedPose = (null) 24.08.2013 15:51: 28.421 Приложение [2171: a0b] defaultImage = (null) 2013-08-24 15: 51: 28.421 Приложение [2171: a0b] cocos2d: CCSpriteFrameCache: Frame '(null)' не найден 2013-08-24 15: 51: 28.422 Приложение [2171: a0b] defaultPose = (null) 2013-08-24 15: 51: 28.422 Приложение [2171: a0b] *** Ошибка утверждения в - [CCSprite initWithSpriteFrame:],

Вот код, который вызывает проблему и отображает этот вывод:

    NSString* spriteSheetName = [theDictionary objectForKey:@"SpriteSheet"];
    CCLOG(@"sprite sheet name is %@", spriteSheetName);
    NSString* plistName = [NSString stringWithFormat:@"%@.plist", spriteSheetName ];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName ];

    NSString* bruisedImage = [theDictionary objectForKey:@"BruisedPose"];
    CCLOG(@"bruisedImage = %@",bruisedImage);
    bruisedPose = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:bruisedImage];
    CCLOG(@"bruisedPose = %@",bruisedPose);

    NSString* defaultImage = [theDictionary objectForKey:@"BasePose"];
    CCLOG(@"defaultImage = %@",defaultImage);
    defaultPose = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:defaultImage];
    CCLOG(@"defaultPose = %@",defaultPose);

Я использую листы спрайтов и файл .plist для создания своей игры. Файл .plist листа спрайтов выглядит так: введите описание изображения здесь

Файл .plist, который я использую для данных игры, выглядит так: введите описание изображения здесь


person PoKoBros    schedule 24.08.2013    source источник
comment
выгрузите содержимое словаря, чтобы выяснить, соответствует ли оно тому, что предполагает изображение. Читая журналы и ваш код, кажется, что PlayerProperties (theDictionary) является неполным по отношению к вашему ожидаемому контенту.   -  person YvesLeBorg    schedule 25.08.2013
comment
ps: добавьте точку останова на исключение в Xcode, чтобы вы могли видеть точную строку, в которой происходит сбой, и проверять переменные.   -  person LearnCocos2D    schedule 25.08.2013
comment
2013-08-24 22: 49: 57.013 Приложение Зака ​​[2488: a0b] key = AnimationBaseName value = thefinalcharacter 2013-08-24 22: 49: 57.013 Приложение Зака ​​[2488: a0b] key = PlayerLocation value = {301,384} 2013- 08-24 22: 49: 57.014 Приложение Зака ​​[2488: a0b] key = IsAnimated value = 1 2013-08-24 22: 49: 57.015 Приложение Зака ​​[2488: a0b] key = Gravity value = 4 2013-08-24 22 : 49: 57.015 Приложение Зака ​​[2488: a0b] key = SpriteSheet значение = characterssheet_poses 24.08.2013 22: 49: 57.016 Приложение Зака ​​[2488: a0b] key = BruisedImage value = thefinalcharacter.png 2013-08-24 22:49 : 57.017 Приложение Зака ​​[2488: a0b] key = FramesToAnimate value = 4   -  person PoKoBros    schedule 25.08.2013
comment
Чтобы добавить к комментарию непосредственно выше, это новый результат. Я хочу, чтобы BaseImage был измененcharacters.png, и я хочу, чтобы BruisedImage был измененcharacters2.png. Что бы я ни делал, это не изменится. P.S. Я перебрал словарь.   -  person PoKoBros    schedule 25.08.2013


Ответы (1)


У вас есть словарь в словарной ситуации.

Ваш объект theDictionary указывает на корень списка. Первая проблема: поскольку у вас есть 2 разных списка, вы не можете использовать один и тот же объект словаря для чтения информации из обоих списков. Не видя, как вы инициализируете theDictionary, я не могу сказать, но если вы не объедините содержимое обоих списков, в нем будет только одна информация из двух списков.

Затем, если вы хотите получить словарь PlayerProperties (или фреймов), вам нужно будет сделать что-то вроде этого (при условии, что theDictionary представляет словарь данных игры):

NSDictionary* characters = [theDictionary objectForKey:@"Characters"];
NSDictionary* player = [characters objectForKey:@"Player"];
NSDictionary* properties = [player objectForKey:@"PlayerProperties"];
NSString* spritesheet = [properties objectForKey:@"SpriteSheet"];

Или несколько удобнее с KVC:

NSString* spritesheet = 
    [theDictionary objectForKey:@"Characters.Player.PlayerProperties.SpriteSheet"];
person LearnCocos2D    schedule 24.08.2013