Cocos2d-x 3.x getContentSize、getBoundingBox区别,灵活运用于碰撞检测
在很多碰撞检测中经常可以看到它,getContentSize,还有它getBoundingBox的影子。为了具体搞清楚这些细节的东西,写了点代码,测试下。如下图
给一个精灵(100*100),放到它的大小,然后输出值。
getContentSize很容易理解,就是获取到当前物体的大小,但是要注意是本身大小,无论是是缩放还是缩小了,其获取的还是它原来的本身大小。所以放到后还是打印出100*100大小
getBoundingBox就有点学问了,先看看源码说了什么先
Rect Node::getBoundingBox() const
{
Rect rect(0, 0, _contentSize.width, _contentSize.height);
return RectApplyAffineTransform(rect, getNodeToParentAffineTransform());
}
返回的是该_contentSize的一个矩阵大小。有点不清不楚
看看API文档写了什么
返回 一个AABB(轴向包围盒)在它的父坐标系中。
返回
一个AABB(轴向包围盒)在它的父坐标系中
好吧,有点味道了,难怪在碰撞检测中经常可以用到,要注意是父坐标中,也就是本地坐标
返回正题,看看上述代码,打印的结果,打印的东东为x,y的最大值跟最小值,给个图吧
这样的话,
getBoundingBox打印的值就是从这个 左下角开始打印的
那么就是
568 开始,最大的X就是加上140(为缩放后的大小)就是708,噢了。
那么就有一个疑问,假设我把锚点钉0.5 0.5那么它是不是以锚点为原点开始跟上述这样计算?
打印下
1136.000000
100.000000,100.000000
498.000000,638.000000,250.000000,390.000000
可见并不是的。还是以图形的做下角为原点计算。
怎么算得,锚点为0.5 0.5那么图像中间就是为568 320 整个矩形放大后为140*140这样矩形的左下角就是为568-70,320-70那么就是498 250了。O了。
因此一般在检测时,getContentSize、getBoundingBox灵活使用。原理清楚了,怎么写都可以。