0

スプライト自体のアニメーション化が完了した後、メインゲームレイヤーからスプライトを削除しようとしています...これを実現するために、最初に次のようにブロックをスプライトオブジェクトのCCSequenceに渡そうとしました。

#Game.m
// some method
    [self.spriteMan zoomAwayWithBlock:{[self destroySpriteMan];}];
    [self createNewSpriteMan];
}

-(void)destroySpriteMan {
    [self removeChild:self.spriteMan cleanup:YES];
}

#SpriteMan.m
-(void)zoomAwayWithBlock:(void(^)())block {
    [self runAction:[CCSequence actions: [CCScaleTo actionWithDuration:2.0f scale:1.0f],
                     [CCCallFuncN actionWithBlock:block],
                     nil]];
}

どういうわけか、self.spriteManのバインディングが台無しになっていて、アニメーションが完了する前に[self createNewSpriteMan]が呼び出されているのではないかと思いました。そこで、spriteManを呼び出す前にtempSpriteMan変数に格納し、tempSpriteManでremoveChildを試行しました。 .....どちらもすぐにクラッシュします。

次に、セレクターとターゲットを使用するようにこれを書き直しました。

#game.m
[self.spriteMan zoomAwayWithSelector:@selector(destroySpriteMan:) target:self];

-(void)destroySpriteMan:(SpriteMan *)spriteMan {
    [self removeChild:spriteMan cleanup:YES];
}

#SpriteMan.m
-(void)zoomAwayWithSelector:(SEL)sel target:(id)target {
    [self runAction:[CCSequence actions: [CCScaleTo actionWithDuration:2.0f scale:1.0f],
                     [CCCallFuncN actionWithTarget:target selector:sel],
                     nil]];
}

同じ結果..毎回クラッシュ......何が間違っているのですか?

4

2 に答える 2

1

Aroth が指摘したように、答えは次のトピックにあります: http://cocos2d-iphone.org/forum/topic/6818

これは問題の解決策を示しており、これをアクションの配列に入れると問題が解決しました:

[CCCallFuncO actionWithTarget:self selector:@selector(removeFromParentAndCleanup:) object:[CCNode node]].
于 2012-08-22T21:19:17.427 に答える
0

メソッドを使用してCCNodeにカテゴリを追加してみることができます

- (void) removeFromParentWithCleanupYes
{
    [self removeFromParentWithCleanup:YES];
}

次に、このようなシーケンスを作成します

id sequence = [CCSequence actions: action1, 
                                   action2, 
                                   ..., 
                                   [CCCallFunc actionWithTarget: target selector:@selector(removeFromParentWithCleanupYes)], 
                                   nil];
[target runAction: sequence];

あまりエレガントではありませんが、うまくいくはずです。

または、親からターゲットを削除する独自の単純なアクションを作成することもできます。

于 2012-08-21T14:51:40.160 に答える