2012-01-16 92 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