2012-01-16 4 views
1

私はcocos2dの開発に新しく、有効なboundingBoxcontentSizeを取得し、CCActionを子どもと一緒にCCNodeに実行するという問題に遭遇しました。あなたのCCNodeに子供がいて、CCNodeboundingBox(たとえば)と呼んだ場合、の子どもを考慮したCCNodeが得られるはずです。それとも、私のコードを間違って整理しているのですか?子どものプロパティとアクションを持つ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 

私はこれについていくつかのフィードバックを得たいと思います。たとえば、私はboundingBoxCの代わりにboundingBoxという名前を使用することから始めましたが、それは良い練習(それはうねりを伴う)であるとは確信していませんでした。また、より包括的で洗練されたソリューションがあれば、それについて聞いてみたいと思います。

ありがとうございます!

+0

あなたの質問とは無関係に、あなたのrunActionC:ではメモリリークはありませんか? –

+0

@XSlashをリリースせずにコピーしています。ヘッドアップのおかげです。私は 'release'を含むようにコードを修正しました。 – donkim

答えて

0

ノードを基準点と考え、ボックスではなく、デフォルト動作がそのままの理由を理解することができます。あなたのコードはきれいに見えます(そしてサブクラスではなくカテゴリに入っているのがうれしいです!)、あなたのロジックに問題は見られません。間違いなく組み込みのメソッドをオーバーライドしないでください(本当に必要な場合を除いて).1)コンフリクトを作成し、2)将来の開発者が混乱する可能性があります。

+0

コードの検証をありがとう! – donkim

+0

問題はありません - 私は助けることができてうれしい:) – jrtc27

関連する問題