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或其他节点绘制的时候并不需要进行坐标系的转换,因此,此处也不需要。