2012-04-13 154 views
0

我正在开发一款游戏,并且我给了用户一些机会来发射大炮。火动画被缓存,但它具有25px的宽度,并且火有时会达到150px。我现在正在创建4x6 = 24个CCSprites,并且每个运行24个动画(缓存帧),每个10帧(缓存帧)...问题在于它变得非常缓慢,火焰动画不会同时开始/结束,游戏中的其他动画变得越来越慢......你明白了......有什么想法可以改进它?谢谢你们!cocos2d CCSprite +动画重复?

这是代码:

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:[动画findAnimation:动画] 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; 
} 

回答

0

这是相当容易无意中在cocos2d中使用/创建CCSprites的性能不佳。考虑到这一点,我会推荐下面就动画的cocos2d编程指南:http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:animation

+0

谢谢,我已经读了几个星期前,我还可以” t同时找到这个数量的动画的解决方案 – Agustin 2012-04-13 21:13:49

+0

嗯..你看过多少内存你的spritesheets正在使用和使用不同/更小的图像格式? (例如不是32位)http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:textures – MechEthan 2012-04-13 21:42:28

0

首先,创建你的精灵

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]; 
+0

对不起,我忘了写这是所有生成在这里: [anims addObject:[[Animation findAnimation:anim] getAnimation]]; – Agustin 2012-04-13 21:09:43

2

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]]; 

前正常的反向:

[sprite runAction: [CCSequence actions: action, [action reverse], nil]];