CCSpriteBatchNode和CCArray,查找非活动对象

时间:2012-12-15 05:17:45

标签: iphone cocos2d-iphone ccsprite ccspritebatchnode

对于一个简单的游戏,我有4个不同的平台(全部在一个spritesheet上)。我最初将5个添加到CCSpriteBatchNode,并将它们全部设置为不可见。当我设置我的平台时,我想从我的CCSpriteBatchNode获取某种类型的平台并更改它以使其可见并定位它。

我无法找到不可见的特定类型的平台。反之亦然?

我知道你可以使用[batchnode getchildbytag:tag],但据我所知,只返回一个精灵。有没有什么方法可以将指针指向特定类型的每个平台到一个数组中,这样我可以遍历数组并查找所有不可见的精灵?

谢谢!

2 个答案:

答案 0 :(得分:1)

正如戏剧所暗示的,你别无选择,只能“反复”孩子们。至于识别哪个精灵对应于哪个平台,存在几种方式。一个简单的方法是使用精灵的'tag'属性 - 假设你没有将它用于任何其他目的。

// some constants 

static int _tagForIcyPlatform = 101;
static int _tagForRedHotPlatform = 102;
... etc

// where you create the platforms

CCSptiteBatchNode *platforms= [CCSpriteBatchNode batchNodeWithFile:@"mapItems_playObjects.pvr.gz"];
CCSprite *sp = [CCSprite striteWithSpriteFrameName:@"platform_icy.png"];
sp.tag = _tagForIcyPlatform;
[platforms addChild:sp];

sp = [CCSprite striteWithSpriteFrameName:@"platform_redHot.png"];
sp.tag = _tagForRedNotPlatform;
[platforms addChild:sp];


// ... etc

// where you want to change properties of 

-(void) setVisibilityOf:(int) aPlatformTag to:(BOOL) aVisibility {
    for (CCNode *child in platforms.children) {
        if (child.tag != aPlatformTag) continue;
        child.visible = aVisibility;
    }
}

再一次,如果你没有将平台的孩子的标签用于其他目的,这是有效的。如果您需要用于其他目的的标记,请考虑在类中使用NSMutableArray,每个平台类型一个,并在该数组中存储指向相应类型的精灵的指针。

答案 1 :(得分:0)

没有一种非常简单的方法可以做到这一点。您需要遍历孩子并单独检查每个孩子。

为了提高编码效率,请考虑向CCSpriteBatchNode添加一个类别,为您执行此功能。这样你就可以根据需要轻松复制它。