cocos2d CCSprite + повтор анимации?

Я разрабатываю игру и даю пользователю возможность стрелять из пушек. анимация огня кэшируется, но имеет ширину 25 пикселей, а огонь иногда достигает 150 пикселей.

Итак, если я стреляю из 4 пушек шириной 150 пикселей (что-то вроде уровня 6), я сейчас создаю на лету 4x6 = 24 CCSprites и запускаю 24 анимации по 10 кадров в каждой (кэшированные кадры) ... проблема в том, что это становится очень медленным, анимация огня не начинается/заканчивается в одно и то же время, другие анимации в игре становятся медленнее... вы поняли... есть идеи, как это улучшить? Спасибо вам всем!

это код:

NSMutableArray *sprites = [[NSMutableArray alloc] init];
NSMutableArray *anims = [[NSMutableArray alloc] init];

int spr = 0;
for( int i=0; i< [cannons count]; i++ ) {
   CCSprite *cannon = [cannons objectAtIndex:i];
   for( int j=1; j<=cannonRange; j++ ) {

        [sprites addObject:[[CCSprite alloc]init]];
        NSString *anim = @"cannon/fire";
        if( j == cannonRange )
            anim = @"cannon/fire_end";
        [anims addObject:[[Animation findAnimation:anim] getAnimation]];

        float x=cannon.position.x, y=cannon.position.y+25*j;

        ((CCSprite *)[sprites objectAtIndex:spr]).position = ccp(x,y);
        [layer addChild:((CCSprite *)[sprites objectAtIndex:spr]) z:50];

        spr++;
    }
}
for( int k=0; k<[sprites count]; k++){
    [[sprites objectAtIndex:k] runAction:[anims objectAtIndex:k]];
}

(извините, я забыл объяснение этого [anims addObject:[[Animation findAnimation:anim] getAnimation]];)

-(CCAnimate *) getAnimation {

    NSMutableArray *animFrames = [[NSMutableArray alloc]init];
    for(int i = 1; i < size; ++i)
        [animFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[self fileName:i]]];

    CCAnimation *animation = [[CCAnimation alloc] initWithFrames:animFrames delay:[self getDelay]];

    CCAnimate *animate = [[CCAnimate alloc] initWithAnimation:animation restoreOriginalFrame:NO];

    return animate;
}

person Agustin    schedule 13.04.2012    source источник


Ответы (3)


CCAnimate actionWithDuration: animation: restoreOriginalFrame: устарел, используйте это:

Создать спрайт:

CCSprite *sprite = [CCSprite spriteWithFile:@"img.png"];
[self addChild:sprite];

Создать анимацию:

CCAnimation* animation = [CCAnimation animation];   
[animation addSpriteFrameWithFilename:@"frame1.png"];
[animation addSpriteFrameWithFilename:@"frame2.png"];
[animation addSpriteFrameWithFilename:@"frame3.png"];
animation.delayPerUnit = 0.3f;
animation.restoreOriginalFrame = YES;

Создать действие:

id action = [CCAnimate actionWithAnimation:animation];

Добавьте к спрайту:

бывший повторять вечно:

[sprite runAction:[CCRepeatForever actionWithAction:action]];

ex normal с реверсом:

[sprite runAction: [CCSequence actions: action, [action reverse], nil]];
person VivienCormier    schedule 30.05.2013

Довольно легко непреднамеренно получить плохую производительность, используя/создавая CCSprites в cocos2d. Имея это в виду, я бы рекомендовал следовать руководству по программированию cocos2d по анимации: http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:animation

person MechEthan    schedule 13.04.2012
comment
Спасибо, я уже читал это несколько недель назад и до сих пор не могу найти решение для такого количества анимаций одновременно - person Agustin; 14.04.2012
comment
Хм... Вы смотрели, сколько памяти занимают ваши спрайт-листы и используют другой/меньший формат изображения? (например, не 32-разрядная) cocos2d-iphone.org/wiki/doku .php/prog_guide:текстуры - person MechEthan; 14.04.2012

Сначала создайте свой спрайт

CCSprite *sprite = [[CCSprite alloc] init];

Теперь создайте анимацию

anim = [[CCAnimation animation] retain];
[anim addFrameWithFilename:@"frame1.png"];
[anim addFrameWithFilename:@"frame2.png"];
[anim addFrameWithFilename:@"frame3.png"];
...

Теперь, когда вы хотите воспроизвести анимацию, создайте действие анимации.

id animateAction = [CCAnimate actionWithDuration:2.0f animation:anim restoreOriginalFrame:NO];

И скажите своему спрайту запустить анимацию

[sprite runAction:animateAction];
person Nick Bull    schedule 13.04.2012
comment
извините, я забыл написать, что все это сгенерировано здесь: [anims addObject:[[Animation findAnimation:anim] getAnimation]]; - person Agustin; 14.04.2012