在box2d源代码Test.as中有个GetBodyAtMouse函数是用来取得鼠标点击处的物体的,自己修改了一下看如下代码:
private function getBodyAtMouse(includeStatic:Boolean = false):b2Body { // Make a small box. var mousePVec:b2Vec2 = new b2Vec2(stage.mouseX/_physcale, stage.mouseY/_physcale); var aabb:b2AABB = new b2AABB(); aabb.lowerBound.Set(mousePVec.x - 0.001, mousePVec.y - 0.001); aabb.upperBound.Set(mousePVec.x + 0.001, mousePVec.y + 0.001); // Query the world for overlapping shapes. var k_maxCount:int = 10; var shapes:Array = new Array(); var count:int = _world.Query(aabb, shapes, k_maxCount); var body:b2Body = null; for (var i:int = 0; i < count; ++i) { if (shapes[i].GetBody().IsStatic() == false || includeStatic) { var tShape:b2Shape = shapes[i] as b2Shape; var inside:Boolean = tShape.TestPoint(tShape.GetBody().GetXForm(), mousePVec); if (inside) { body = tShape.GetBody(); break; } } } return body; }
4-8行 在鼠标点击处创建一个很小很小的边界盒,用于查询空间中是否有刚体与之重叠。
12行 Query函数负责查询与给定边界盒有重叠的刚体,并返回刚体个数。Query函数需要一个数组,用来保存查找到的刚体形状定义,还需要一个定值,表示数组的最大长度。
16行 根据刚体的形状定义取得刚体,判断是否是休眠状态。
18行 tShape.GetBody().GetXForm()返回b2XForm对象,是一个表示刚体的变形对象,就相当于flash中显示对象都有的transform属性一样,里面包含了刚体的角度,边界等;TestPoint方法查找给定的向量b2Vec(相当于flash中的Point类)是否与b2XForm相重合。