Ошибка при использовании нескольких листов спрайтов в игровом слое с Cocos2d

У меня есть следующий код:

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"cow_sprite.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"ray_sprite.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"chicken_sprite.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"tank_sprite.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"human_sprite.plist"];

self.raySpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"ray_sprite.png"];
self.tankSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"tank_sprite.png"];
self.chickenSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"chicken_sprite.png"];
self.cowSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"cow_sprite.png"];
self.humanSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"human_sprite.png"];

[self addChild:self.raySpriteSheet];
[self addChild:self.tankSpriteSheet];
[self addChild:self.chickenSpriteSheet];
[self addChild:self.cowSpriteSheet];
[self addChild:self.humanSpriteSheet];

for (int i = 0; i < 13; ++i) {
    Dice* d = [[Dice alloc] initRandom];

    if (d.fileNum == 0 || d.fileNum == 1) {
        [self.raySpriteSheet addChild:d.sprite];
    }else if(d.fileNum == 2){
        [self.tankSpriteSheet addChild:d.sprite];
    }else if(d.fileNum == 3){
        [self.chickenSpriteSheet addChild:d.sprite];
    }else if(d.fileNum == 4){
        [self.cowSpriteSheet addChild:d.sprite];
    }else if(d.fileNum == 5){
        [self.humanSpriteSheet addChild:d.sprite];
    }
    [rollDiceArray addObject:d];
}

Идея состоит в том, что я хочу иметь возможность использовать 5 отдельных листов спрайтов для 5 отдельных анимаций игральных костей. Я предварительно определяю значение для каждого кубика, затем назначаю спрайт/анимацию и, наконец, добавляю этот спрайт в соответствующий CCSpriteBatchNode.

Он пройдет через первую итерацию, но затем выдаст ошибку на второй, выдав эту ошибку:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'CCSprite is not using the same texture id'

Есть предположения?


person rnystrom    schedule 09.11.2011    source источник


Ответы (1)


Ошибка указывает на то, что вы пытались добавить CCSprite в CCSpriteBatchNode, который был инициализирован с текстурой, отличной от текстуры, которую использует CCSprite. Другими словами: CCSpriteBatchNode и все CCSprite, добавленные к этому пакетному узлу, должны использовать одну и ту же текстуру.

В качестве примечания: если изображения коровы, ската, танка, курицы и человека вписываются в один текстурный атлас, то обязательно поместите их в один текстурный атлас. Цель текстурного атласа не в том, чтобы сортировать и классифицировать ваши изображения, а в том, чтобы ускорить их визуализацию. Чем больше изображений вы можете упаковать в один и тот же атлас текстур, тем быстрее вы сможете их визуализировать — в идеале с помощью всего одного узла партии спрайтов.

person LearnCocos2D    schedule 10.11.2011
comment
Вроде должно исправить. Я собираюсь провести день, помещая все в один большой спрайт. Должна быть возможность совместить все в одном. Единственное, что мне нужно выяснить, это как различать разные спрайты (танк/луч/корова/курица/человек) на одном листе. - person rnystrom; 10.11.2011
comment
У вас есть их имена. И, конечно же, вы можете использовать программу атласа текстур, такую ​​как TexturePacker: texturepacker.com - person LearnCocos2D; 10.11.2011
comment
Ты сделал это. Однако у меня есть некоторые другие проблемы, когда спрайты не отображаются. Никаких ошибок и прочего. Я создал еще один вопрос для этого. Если у вас есть какие-то идеи, попробуйте. stackoverflow.com/questions/8159649/ - person rnystrom; 17.11.2011