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

Dyl*_*lan 11 bounding-box cocos2d-iphone

作为我之前关于显示锚点的问题的后续问题,我 CCSprite子类化并更改其绘制方法如下:

[super draw];
ccDrawColor4F(0, 1, 0, 1);
ccDrawCircle(self.anchorPointInPoints, 20, 0, 8, YES);
Run Code Online (Sandbox Code Playgroud)

这非常有效.为了额外的功劳,我添加了以下内容来显示其边界框:

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);
Run Code Online (Sandbox Code Playgroud)

这也很有用,直到我重新表达一个精灵:

CGPoint oldPosition = [sprite convertToWorldSpace:sprite.position];
[sprite removeFromParentAndCleanup:NO];
[parentSprite addChild:sprite];
sprite.position = [sprite convertToNodeSpace:oldPosition];
Run Code Online (Sandbox Code Playgroud)

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

Kre*_*iri 20

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

当您将节点重新显示到具有不同原点的父节点,同时保持此节点的相同"世界"位置时,其边界框的原点将更改.

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

其次,你不需要使用convert-to-x-space舞蹈来绘制精灵的边界框.在项目的cocos2d文件夹中打开ccConfig.h文件并进行更改

#define CC_SPRITE_DEBUG_DRAW 0
Run Code Online (Sandbox Code Playgroud)

#define CC_SPRITE_DEBUG_DRAW 1
Run Code Online (Sandbox Code Playgroud)

第三,sprite.position点的坐标是相对于它的父节点,而不是相对于精灵.当你打电话时[node convertToWorldSpace:aPoint],它会把它aPoint当作节点的本地空间.如果你想获得一个节点的位置的世界坐标,你应该叫convertToWorldSpace:节点的父:[node.parent convertToWorldSpace:node.position].