4

それ自体が現在実行中のゲーム ロジックの子である call の子である call があるのでCCSprite、この場合です。 永遠に繰り返されるアクションで画面を前後に移動し、それに乗っています。独自のアクションを実行できる場所に「降りて」「乗り込み」たいと思います。spriteCCLayermovingLayerCCLayerselfmovingLayerspritespritemovingLayerself

これをやろうとするとmovingLayer、削除spriteselfて追加するように指示する必要がありますsprite. これは私がやったことです...

- (void)attack:(id)sender
{
    [sprite stopAllActions];
    [movingLayer removeChild:sprite cleanup:YES];
    [self addChild:sprite z:1];
    CGFloat distance = ccpDistance(sprite.position, ccp(sprite.position.x, -sprite.contentSize.height/2));
    id goDown = [CCMoveTo actionWithDuration:distance/moveDuration position:ccp(sprite.position.x, -sprite.contentSize.height/2)];
    id repeatDown = [CCRepeatForever actionWithAction:[CCSequence actions:[CCMoveTo actionWithDuration:0 position:ccp(sprite.position.x, sprite.contentSize.height/2+self.contentSize.height)], [CCMoveTo actionWithDuration:moveDuration position:ccp(sprite.position.x, -sprite.contentSize.height/2)], nil]];
    id attackAction = [CCSequence actions:goDown, repeatDown, nil];
    [sprite runAction:attackAction];
}

stopAllActions冗長だと思いますが、それは問題ではありません。sprite追加するmovingLayer前に削除selfすると、ゾンビにアクセスするためにクラッシュし、self最初に追加しようとすると、既に追加されているものを追加しようとしてクラッシュします。

4

1 に答える 1

9

クリーンアップを NO に設定してみましたか?

または、movingLayer から削除する前にスプライトを保持し、使い終わったら解放します。

[sprite retain];
[movingLayer removeChild:sprite cleanup:YES];
[self addChild:sprite z:1];
[sprite release];
于 2011-08-16T22:25:04.213 に答える