我对cocos2d开发很陌生,遇到了一个问题:获得有效的boundingBox
和contentSize
,并在CCAction
s上运行带有子项的CCNode
s。在我看来,如果您的CCNode
有孩子并且您在boundingBox
上致电CCNode
(例如),那么您应该CGRect
CCNode
考虑到它的孩子。或者我只是错误地组织我的代码..?
无论如何,我为CCNode
编写了一个小类,似乎返回了正确的boundingBox
和contentSize
并对其子代执行了操作。
@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 :(得分:0)
将节点视为参考点,而不是框,您可以看到默认行为原因。你的代码看起来很干净(很高兴看到它在一个类别而不是一个子类!)我看不出你的逻辑有任何问题。绝对不要覆盖内置方法(除非你真的需要),因为1)你可能会产生冲突,2)未来的开发人员会感到困惑。