11

作为我之前关于显示锚点的问题的后续问题,我将 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];

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

4

2 回答 2

20

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

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

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

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

#define CC_SPRITE_DEBUG_DRAW 0

线到

#define CC_SPRITE_DEBUG_DRAW 1

第三,sprite.positionpoint 的坐标是相对于它的 parent的,而不是相对于 sprite 的。当您调用 时[node convertToWorldSpace:aPoint],它会将其aPoint视为在节点的本地空间中。如果要获取节点位置的世界坐标,则应调用节点convertToWorldSpace:parent : [node.parent convertToWorldSpace:node.position]

于 2012-08-27T09:42:30.433 回答
4

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

于 2016-12-27T23:44:00.847 回答