2012-01-16 88 views
1

我是相当新的cocos2d开发和遇到问题获得有效的boundingBoxcontentSize和运行CCAction s与CCNode s与子。在我看来,如果你的CCNode有孩子,你在CCNode上拨打boundingBox(例如),你应该得到一个CCNodeCGRect,考虑到它的孩子。或者是我只是错误地组织我的代码..?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,但不相信这是很好的做法(它涉及到混搭)。或者,如果有更全面,更优雅的解决方案,我很乐意听到。

谢谢!

+0

与您的问题无关,在您的runActionC中,是不是内存泄漏?你正在拷贝而没有发布 – 2012-01-17 00:09:39

+0

@XSlash,谢谢你的支持。我修改了代码以包含'release'。 – donkim 2012-01-17 01:51:53

回答

0

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

+0

感谢您对代码的验证! – donkim 2012-01-18 18:22:27

+0

没问题 - 很高兴我可以帮助:) – jrtc27 2012-01-18 19:12:39