1

我在 ccarray 中添加了三种类型的精灵。

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 中识别这些精灵。请用语法回答。我在数组中随机添加了这三个精灵。现在在 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:] : * remove me : before refresh red *

-[SoldierMapLayout sequenceEngagement:]:标签:1024 名称:CCSprite:walk_red_rogue_idle0001.png

-[SoldierMapLayout sequenceEngagement:]:标签:891 名称:CCSprite:不能移动

-[SoldierMapLayout sequenceEngagement:]:标签:889 名称:CCSprite:无法治愈

-[SoldierMapLayout sequenceEngagement:] : tag: 890 name : CCSprite : Charmed

-[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 回答