cocos2d CCSprite + 动画重复?
Posted
技术标签:
【中文标题】cocos2d CCSprite + 动画重复?【英文标题】:cocos2d CCSprite + animation repeat? 【发布时间】:2012-04-13 19:47:53 【问题描述】:我正在开发一款游戏,并为用户提供发射大炮的机会。火焰动画被缓存,但宽度为 25 像素,火焰有时会达到 150 像素。
所以,如果我发射 4 门大炮,宽度为 150 像素(类似于 6 级),我目前正在动态创建 4x6 = 24 个 CCSprite,并运行 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;
【问题讨论】:
【参考方案1】: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];
添加到精灵:
ex 永远重复:
[sprite runAction:[CCRepeatForever actionWithAction:action]];
ex 正常与反向:
[sprite runAction: [CCSequence actions: action, [action reverse], nil]];
【讨论】:
【参考方案2】:在 cocos2d 中使用/创建 CCSprite 很容易无意中获得糟糕的性能。考虑到这一点,我建议遵循 cocos2d 动画编程指南:http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:animation
【讨论】:
谢谢,几周前我已经读到了,但我仍然无法同时为这么多的动画找到解决方案 嗯..您是否查看过您的 spritesheets 占用了多少内存并使用了不同/更小的图像格式? (例如,不是 32 位)cocos2d-iphone.org/wiki/doku.php/prog_guide:textures【参考方案3】:首先,创建你的精灵
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];
【讨论】:
对不起,我忘记写了,这都是在这里生成的:[anims addObject:[[Animation findAnimation:anim] getAnimation]];以上是关于cocos2d CCSprite + 动画重复?的主要内容,如果未能解决你的问题,请参考以下文章
用另一个 CCSprite/CCNode 剪辑 CCSprite/CCNode - Cocos2D