1

ゲームでリスのヒーローが果物に触れたときに果物をアニメートしたいです。アニメート後、果物をシーンから削除する必要があります。2週間試しましたが、うまくいきませんでした。私のスプライトシートには6つのフレームがあります。スプライトアニメーション。

現在、ヒーローが果物と交差するときに、以下のコードを実行しています:

            NSMutableArray *burst = [NSMutableArray array];

            for(int i = 1; i <= 6; ++i) {
              [burst addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Fruit01000%d.png", i]]];
            }

            CCAnimation *walkAnim = [CCAnimation animationWithFrames:burst delay:0.02f];
            CCActionInterval *animAction = [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO];


            [expl stopAllActions];
            expl.visible = TRUE;
            expl.position = ccp(coinColl.position.x,coinColl.position.y);

            cleanupAction = [CCCallFuncND actionWithTarget:self selector:@selector(explOver:) data:expl];
            seqF = [CCSequence actions:animAction, cleanupAction, nil];


            [expl runAction:seqF];     


            [platformLayer removeChild:coinColl cleanup:YES];
            [self sumScore]; 
            [coinLabel setString: [NSString stringWithFormat:@"%i",appDelegate.coinScore+appDelegate.levelScore]];

explOver()関数:

-(void) explOver:(CCSprite*)explosion{
    explosion.visible = FALSE;
}

部分的に機能しているため、一部のフルーツではアニメーションが表示されず、次のシーンにジャンプするとアプリがクラッシュし、「解放されているポインターが割り当てられていません」というエラーが表示されます。

4

1 に答える 1

0

ゲームレイヤーからスプライトを完全に削除したい場合は、このカテゴリとしてCCNodeクラスにカテゴリを追加できます。

@interface CCNode(CategoryName)
- (void) removeFromParentAndCleanupYES;
@end

@implementation CCNode(CategoryName)
- (void) removeFromParentAndCleanupYES
{
    [self removeFromParentAndCleanup:YES];
}
@end

次に、シーケンスを使用してアクションを実行した後、このメソッド呼び出しを追加できます。

id animate = // any action, CCAnimate in your case
id callback = [CCCallFunc actionWithTarget:_fruitSprite selector:@selector(removeFromParentAndCleanupYES)];
id sequence = [CCSequence actionOne: animate two: callback];
[_fruitSprite runAction: sequence];

これは単なる提案ですが、問題なく機能するはずです。コードのいくつかの部分でアクションを使用してノードを削除する必要があるかどうかは理にかなっています。


別の変形は、指定されたセレクターにパラメーターとしてスプライトを渡すCCCallFuncNアクションを使用することです。

id animate = // any action, CCAnimate in your case
id callback = [CCCallFuncN actionWithTarget:self selector:@selector(onAnimationDidFinished:)];
id sequence = [CCSequence actionOne: animate two: callback];
[_fruitSprite runAction: sequence];


- (void) onAnimationDidFinished:(CCNode*)node
{
    [node removeFromParentAndCleanup:YES];
}
于 2012-12-10T10:59:32.453 に答える