【问题标题】:How can I display the bounding box for a CCNode in cocos2d?如何在 cocos2d 中显示 CCNode 的边界框?
【发布时间】:2012-08-21 12:32:52
【问题描述】:

作为我之前关于displaying the anchor point 的问题的后续问题,我将CCSprite 子类化并更改了它的draw 方法,如下所示:

[super draw];
ccDrawColor4F(0, 1, 0, 1);
ccDrawCircle(self.anchorPointInPoints, 20, 0, 8, YES);

这很好用。为了获得额外的功劳,我添加了以下内容以显示其边界框:

CGRect bb = self.boundingBox;
CGPoint vertices[4] = {
    [self convertToNodeSpace:ccp(bb.origin.x, bb.origin.y)],
    [self convertToNodeSpace:ccp(bb.origin.x + bb.size.width, bb.origin.y)],
    [self convertToNodeSpace:ccp(bb.origin.x + bb.size.width, bb.origin.y + bb.size.height)],
    [self convertToNodeSpace:ccp(bb.origin.x, bb.origin.y + bb.size.height)],
};
ccDrawPoly(vertices, 4, YES);

这也很有效,直到我重新定义一个精灵:

CGPoint oldPosition = [sprite convertToWorldSpace:sprite.position];
[sprite removeFromParentAndCleanup:NO];
[parentSprite addChild:sprite];
sprite.position = [sprite convertToNodeSpace:oldPosition];

精灵现在在正确的位置,它的锚点绘制在它应该绘制的位置,但边界框绘制在错误的位置。我做错了什么?

【问题讨论】:

    标签: cocos2d-iphone bounding-box


    【解决方案1】:

    节点的边界框相对于其父节点。在draw 方法中完成的绘图是在节点的本地空间convertToNodeSpace:将坐标从世界空间转换到本地空间,而不是从父空间。

    当您将节点重新设置为具有不同原点的父节点同时保持该节点的相同“世界”位置时,其边界框的原点会发生变化。

    您的错误是您将精灵的边界框视为其坐标位于世界空间中。

    其次,您不需要执行转换为 x 空间的舞蹈来绘制精灵的边界框。在你的项目的 cocos2d 文件夹中打开 ccConfig.h 文件并更改

    #define CC_SPRITE_DEBUG_DRAW 0
    

    行到

    #define CC_SPRITE_DEBUG_DRAW 1
    

    第三,sprite.position 点的坐标是相对于它的父级,而不是相对于精灵。当您调用[node convertToWorldSpace:aPoint] 时,它会将aPoint 视为在节点的本地空间中。如果你想得到一个节点位置的世界坐标,你应该在节点的父节点上调用convertToWorldSpace:[node.parent convertToWorldSpace:node.position]

    【讨论】:

    • 谢谢!很有启发性。现在都修好了。我实际上需要子类 CCSprite,因为我想有选择地打开边界框,但是从 CC_SPRITE_DEBUG_DRAW 借用代码并绘制由quad_.tl.vertices 顶点形成的多边形正是我需要的。
    • 我可能会补充一点,标签节点也可以使用 CC_LABEL_DEBUG_DRAW
    【解决方案2】:

    我通常用以下方式绘制 AABB:

    Rect aabb = someNode->getBoundingBox();
    DrawNode* drawNode = DrawNode::create();
    drawNode->drawRect(aabb.origin, aabb.origin + aabb.size, Color4F(1, 0, 0, 1));
    parentNode->addChild(drawNode, 100);
    

    注意:如果Rect aabb 的大小为 (0,0),则不会绘制矩形。

    【讨论】:

    • 很好的答案。我喜欢它不需要像上面那样重新编译 Cocos2d-x!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2021-09-18
    • 2012-07-12
    相关资源
    最近更新 更多