绘制CCNode的boundingBox

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

你可能感兴趣的:(绘制CCNode的boundingBox)