cocos2d-x里面有CCSprite的绘制显示范围的代码(详见CCSprite的draw函数)。但是有的时候我们希望绘制CCNode或者CCLayer的boundingBox。
例如GUI界面显示或测试的时候,如果可以显示boundingBox的话,会方便很多。尤其是加上锚点(anchor point)的时候,有boundingBox显示可以更加直观的查看其坐标,偏移,旋转等等。 点击的时候也可以直观的看到显示范围和点击区域。
绘制boundingBox的过程中,我走了大弯路,一个基本的问题困扰了我一个多小时。 我太依赖和相信自己的固有经验和知识反而被绕进去了,以此为戒。
先上代码:
#define kDebugDrawNode 1
void CCNode::draw()
{
//CCAssert(0);
// override me
// Only use- this function to draw your stuff.
// DON'T draw your stuff outside this method
#if kDebugDrawNode == 1
// draw bounding box
CCPoint pt;
pt.x = 0;
pt.y = 0;
CCSize size = boundingBox().size;
CCPoint vertices[4]={
ccp(pt.x, pt.y + size.height),
ccp(pt.x, pt.y),
ccp(pt.x + size.width, pt.y),
ccp(pt.x + size.width, pt.y + size.height)
};
ccDrawPoly(vertices, 4, true);
#endif // CC_SPRITE_DEBUG_DRAW
CC_INCREMENT_GL_DRAWS(1);
}
重点是,起始坐标直接设置为(0, 0)就好了,而我测试了半天的getPosition()(包含锚点,convertToWorldSpace等等)。
因为CCNode::draw的前后会glPush一个矩阵,其后所有的绘制都是依赖于这个矩阵的。 所以设置为(0, 0)其实最终绘制的时候就已经包含了自身的坐标、父节点的坐标等等。
如果脑筋更灵活点,可以很容易的想到CCSprite或其他节点绘制的时候并不需要进行坐标系的转换,因此,此处也不需要。