1

私のコードの小惑星が船に向かって来て、レーザーが小惑星に当たった場合の爆発アニメーションを実装したいと思います。小惑星は爆発アニメーションを実行し、非表示モードに切り替える必要があります。

ターゲットが命中したときのアニメーションがない場合、ターゲットは正常にインビジブル モードに切り替わります。オブジェクトを非表示に設定しなくても、アニメーションは問題なく動作します。手続き型コードのためにアニメーションを表示せずにまとめると、オブジェクトがすぐに非表示に設定されました。

アニメーションを表示して非表示モードに設定するにはどうすればよいですか。(ターゲット別名小惑星はさまざまな速度であり、速すぎるものもあれば遅いものもあります)ターゲットを非表示にするという考えは、それらが船にぶつかるのを防ぐことです。

この質問と回答を試しました cocos2d autoremove sprite after animation didt work

for (CCSprite *asteroid in _asteroids) 
{        
     if (!asteroid.visible) continue;

        for (CCSprite *shipLaser in _shipLasers)
        {                        
            if (!shipLaser.visible) continue;

            if (CGRectIntersectsRect(shipLaser.boundingBox, asteroid.boundingBox)) 
            {                
                [[SimpleAudioEngine sharedEngine] playEffect:@"explosion_large.caf"];

                //explosion zombie animation starts 
                NSMutableArray *walkAnimFrames = [NSMutableArray array];
                for(int i = 1; i <= 12; ++i) 
                {
                    [walkAnimFrames addObject:
                     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
                      [NSString stringWithFormat:@"zombieexplodes%d.png", i]]];
                }
                CCAnimation *walkAnim = [CCAnimation 
                                         animationWithFrames:walkAnimFrames delay:0.1f];


                _dieAction = [CCRepeatForever actionWithAction:
                               [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];

                [asteroid runAction:_dieAction];
                //explosion zombie ends

                [self addPoint];

                //change meme to woohoo.png   
                [_ship setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: @"woohoo.png"]];

                shipLaser.visible = NO;
                [asteroid setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: @"zombieexplodes13.png"]];
                //asteroid.visible=NO;


                continue;
            }
        }
}
4

2 に答える 2

1

Cocoa2D でゲーム開発を行ったことはありませんが、このようなゲームを作成すると、アニメーションが終了したときに自分自身を削除する別の爆発オブジェクトができました。したがって、爆発オブジェクトを生成して、小惑星をすぐに見えなくする必要があります。アニメーションの終了時に自動削除が機能しない場合は、爆発の時間を計ってから、爆発オブジェクトにタイマーを設定して、それ自体を削除します。

小惑星を非表示にしていることに気付きました...代わりにそれらを削除する必要があります-非表示の場合でもメモリを占有します。

于 2012-07-26T17:43:55.307 に答える
1

呼び出しでこのスタイルを使用します。

CCAnimation *walkAnim = [CCAnimation 
                         animationWithFrames:walkAnimFrames delay:0.1f];
id animate  = [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO];
id calFuncN = [CCCallFuncN actionWithTarget:self selector:@selector(explodeAnimDone:)];
id sequence = [CCSequence actions:animate, calFuncN,nil];

[asteroid runAction:sequence];

アニメーションが完了したら、スプライトを無効にします。

-(void)explodeAnimDone:(id)sender
{
    CCNode *myNode = (CCNode*)sender;
    myNode.visible = false;
}
于 2012-07-26T18:09:49.667 に答える