1

ccarrayに3種類のスプライトを追加しました。

CCArray *storeObject=[[CCArray alloc]initWithCapacity:10];
    CCSprite *sprite1=[CCSprite spriteWithFile:@"sprite1.png"];
    CCSprite *sprite2=[CCSprite spriteWithFile:@"sprite2.png"];
    CCSprite *sprite3=[CCSprite spriteWithFile:@"sprite3.png"];
    [storeObject addObject:sprite1];
    [storeObject addObject:sprite2];
    [storeObject addObject:sprite3];
    [self addChild:sprite1 z:1 tag:100];
    [self addChild:sprite2 z:1 tag:101];
    [self addChild:sprite3 z:1 tag:102];

私はこの配列をロジックとして使用しています。これらのスパイトを識別し、さまざまなタイプの操作を実行したい場合。次に、私の質問は、ccarrayからこれらのスプライトをどのように識別できるかということです。構文で答えてください。これらの3つのスプライトをランダムに配列に追加しました。ここで、forループで、自分が持っているスプライトを特定したいと思います。これはどのように可能ですか?

4

3 に答える 3

3

これを試して :

for (CCSprite *spr in storeObject)
{
     if (spr.tag == currentTag)
     {
         // you will get the current sprite
         break;
     }
}
于 2012-12-14T09:52:07.870 に答える
0

完全を期すために、同じタグを持つオブジェクトに複数の子を追加できることに注意する必要があります。たとえば、次のコードは次の後にログを提供します。

for (NSUInteger i = 0; i < 10; i++) {
    CCLabelAtlas *toto = [SpriteUtils mapDamageLabel:23+i];

    toto.tag = 901210;
    [self addChild:toto z:0 tag:toto.tag];;
}

MPLOG(@"*** remove me : before refresh %@ ***", self.soldier);
for (id child in children_) {
    CCNode *ch = (CCNode *) child;
    MPLOG(@"<%@> tag: %i name : %@", self.soldier, ch.tag, ch.name);
}

*今ログ*

-[SoldierMapLayout sequenceEngagement:]:*削除してください:赤を更新する前に*

-[SoldierMapLayout sequenceEngagement:]:タグ:1024名前:CCSprite:walk_red_rogue_idle0001.png

-[SoldierMapLayout sequenceEngagement:]:タグ:891名前:CCSprite:移動できません

-[SoldierMapLayout sequenceEngagement:]:タグ:889名前:CCSprite:カントヒール

-[SoldierMapLayout sequenceEngagement:]:タグ:890名前:CCSprite:チャームド

-[SoldierMapLayout sequenceEngagement:]:タグ:886名前:CCSprite:ヘルスバー:18

-[SoldierMapLayout sequenceEngagement:]:タグ:896名前:CCSprite:walk_red_rogue_cast0001.png

-[SoldierMapLayout sequenceEngagement:]:タグ:895名前:CCLabelAtlas:重大なダメージ16

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ23

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ24

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ25

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ26

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ27

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ28

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ29

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ30

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ31

-[SoldierMapLayout sequenceEngagement:]:タグ:901210名前:CCLabelAtlas:ダメージ32

したがって、後で[self getChildByTag:901210]を実行すると、CCNodeは、タグで最初に見つかったものを返しますが、必ずしも探しているものではありません。

于 2012-12-14T15:25:03.063 に答える
0

まず、その余分なCCArrayをねじ込みます(また、CCArrayをねじ込みます。バグがあり、代わりにNSMutableArrayに固執します)。ほとんどの場合、それはまったく必要ありません。これにより、コードが次のように簡略化されます。

CCSprite *sprite1=[CCSprite spriteWithFile:@"sprite1.png"];
CCSprite *sprite2=[CCSprite spriteWithFile:@"sprite2.png"];
CCSprite *sprite3=[CCSprite spriteWithFile:@"sprite3.png"];
[self addChild:sprite1 z:1 tag:100];
[self addChild:sprite2 z:1 tag:101];
[self addChild:sprite3 z:1 tag:102];

次に、sprite3.pngでスプライトを取得するには、getChildByTagを使用します。

CCSprite* itsSprite3 = [self getChildByTag:102];

結局のところ、それがタグの目的です!

スプライトが3つしかなく、そのパーティからそれらを削除しない場合は、3つのivars sprite1、sprite2、sprite3を作成して、クラスのどこからでもいつでもアクセスできるようにすると、さらに簡単になります。

于 2012-12-14T12:58:52.470 に答える