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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值