0

私はゲームを開発しており、ユーザーに大砲を発射する機会を与えています。炎のアニメーションはキャッシュされますが、幅が 25px で、炎が 150px になることもあります。

したがって、幅 150px (レベル 6 のような sth) で 4 つの大砲を発射すると、現在 4x6 = 24 の CCSprite をオンザフライで作成し、それぞれ 10 フレーム (キャッシュされたフレーム) の 24 のアニメーションを実行しています... 問題は、それが非常に遅くなる、火のアニメーションが同時に開始/終了しない、ゲーム内の他のアニメーションが遅くなる...アイデアが得られます...これを改善するアイデアはありますか? 皆さん、ありがとうございました!

これはコードです:

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;
}
4

3 に答える 3

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

スプライトに追加:

ex 永久に繰り返す :

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

ex normal with reverse :

[sprite runAction: [CCSequence actions: action, [action reverse], nil]];
于 2013-05-30T15:47:03.813 に答える
0

cocos2d で CCSprite を使用/作成すると、意図せずにパフォーマンスが低下するのは非常に簡単です。それを念頭に置いて、アニメーションに関する cocos2d プログラミング ガイドに従うことをお勧めします: http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:animation

于 2012-04-13T20:26:32.670 に答える
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];
于 2012-04-13T20:32:34.333 に答える