如何在cocos2d中显示CCNode的边界框?

时间:2012-08-27 00:00:42

标签: cocos2d-iphone bounding-box

作为我之前关于displaying the anchor point的问题的后续问题,我将CCSprite子类化并更改其绘制方法如下:

[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];

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

2 个答案:

答案 0 :(得分:20)

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

当您将节点重新显示给具有不同来源的父节点,同时保持此节点的相同“世界”位置时,其边界框的原点会发生变化。

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

其次,你不需要使用convert-to-x-space舞蹈来绘制精灵的边界框。在项目的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]

答案 1 :(得分:3)

我通常用以下方式绘制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),则不会绘制矩形。