具有子属性和动作的CCNode

时间:2012-01-16 22:07:14

标签: iphone cocos2d-iphone

我对cocos2d开发很陌生,遇到了一个问题:获得有效的boundingBoxcontentSize,并在CCAction s上运行带有子项的CCNode s。在我看来,如果您的CCNode有孩子并且您在boundingBox上致电CCNode(例如),那么您应该CGRect CCNode考虑到它的孩子。或者我只是错误地组织我的代码..?

无论如何,我为CCNode编写了一个小类,似乎返回了正确的boundingBoxcontentSize并对其子代执行了操作。

@implementation CCNode(Children)

- (CGRect)boundingBoxC {
    if (self.boundingBox.size.width != 0 || self.boundingBox.size.height != 0) {
        return self.boundingBox;
    }

    CGRect holderRect = CGRectZero;

    for (int i = 0; i < self.children.count; i++) {
        CCNode *node = [self.children objectAtIndex:i];
        holderRect = CGRectUnion(holderRect, node.boundingBoxC);
    }

    return holderRect;
}

- (CGSize)contentSizeC {
    return self.boundingBoxC.size;
}

- (void)runActionC:(CCAction *)action {
    [self runAction:action];

    for (int i = 0; i < self.children.count; i++) {
        id action2 = [action copy];
        CCNode *node = [self.children objectAtIndex:i];
        [node runActionC:action2];
        [actions2 release];
    }
}

@end

我很想得到一些反馈。例如,我首先尝试使用名称boundingBox而不是boundingBoxC,但并不相信这是一个好习惯(它涉及调配)。或者,如果有一个更全面,更优雅的解决方案,我很乐意听到它。

谢谢!

1 个答案:

答案 0 :(得分:0)

将节点视为参考点,而不是框,您可以看到默认行为原因。你的代码看起来很干净(很高兴看到它在一个类别而不是一个子类!)我看不出你的逻辑有任何问题。绝对不要覆盖内置方法(除非你真的需要),因为1)你可能会产生冲突,2)未来的开发人员会感到困惑。