取得鼠标点击处的物体

在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相重合。

原文地址:https://www.cnblogs.com/ywxgod/p/1698748.html