在cocos2d中迭代一个图层的子节点

时间:2012-11-26 20:17:55

标签: iphone objective-c cocos2d-iphone

我正在尝试迭代并删除我的图层的所有子项(HUDLayer)。我试图用以下方法完成这项任务:

    for(id *item in HUDLayer.children_)
    {
        [self removeChild:item cleanup:YES];
    }

但我收到错误 - >表达式没有有效的对象类型

有人可以解释我的问题吗?

谢谢

2 个答案:

答案 0 :(得分:2)

for(id *item

糟糕。 <{1}}本身就是一个对象(也是一个指针),不需要星号。

id

应该没问题。

答案 1 :(得分:0)

在针对另一个问题做了一些谷歌搜索后,刚刚登陆了这个。

您正在尝试从父级(HUDLayer)中删除对象。有人用“自我”回答了这个问题。然而...

你说......

for(id *item in HUDLayer.children_) {
    [self removeChild:item cleanup:YES];
}

...但我虽然我会添加下面的代码,因为我认为这可能会帮助其他人尝试删除子节点而不会出现循环突变。

for(id item in HUDLayer.children) {
    // If it's a sprite that you want to remove
    if ([item isKindOfClass:[CCSprite class]]) {
        // Use this to remove or else you'll have a loop mutation.
        [item removeFromParentAndCleanup:YES];
    }
}

无论如何,希望它有所帮助。

Lol - 现在编辑这个,因为我(估计)迭代并从中移除,偶然,父级可能会导致数组突变。所以,我正在修改上面的内容,首先将所有子元素放在一个数组中,然后迭代IN REVERSE并在此基础上删除对象。这样,避免了阵列突变。见下文:

NSArray *items = [[NSArray alloc] initWithArray: HUDLayer.children];

for (long i = items.count - 1; i >= 0; i--) {
    id item = items[i];
    if ([item isKindOfClass:[CCSprite class]] ||
        [item removeFromParentAndCleanup:YES];
    }
}

items = nil;

再次 - 希望它有所帮助。