由于Box2D是不直接与鼠标交互的,而是通过鼠标关节b2MouseJoint交互的。
交互的过程由四个步骤完成:
第一步:获取鼠标单击处的刚体。
第二步:创建鼠标关节。
第三步:控制鼠标关节。
第四步:销毁鼠标关节。
 
首先,获取刚体。
public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body{
// 在鼠标点击处创建一个极小区域,大小为0.002m*0.002m
var mousePVec:b2Vec2 = new b2Vec2(stage.mouseX/RATIO, stage.mouseY/RATIO);
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);
 
// 查询与指定区域有重叠的刚体
// 查询形状数组最大长度
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
body = tShape.GetBody();
break;
}
}
}
return body;
}
 
接着第二步:创建鼠标关节。
var mouseJointDef:b2MouseJointDef = new b2MouseJointDef();
mouseJointDef.body1 = world.GetGroundBody();
mouseJointDef.body2 = body;
// 设置鼠标关节的目标位置
mouseJointDef.target.Set(mouseX / RATIO, mouseY / RATIO);
// 设置鼠标关节的力度
mouseJointDef.maxForce = 10000;
// 设置鼠标关节的时间步
mouseJointDef.timeStep = TIME_STEP;
mouseJoint = world.CreateJoint(mouseJointDef) as b2MouseJoint;
 
控制鼠标关节很简单,就是在帧循环时间中不断更新鼠标关节的目标位置。
if (mouseJoint)
{
mouseJoint.SetTarget(new b2Vec2(mouseX / RATIO, mouseY / RATIO));
}
 
最后就是在侦听到鼠标弹起事件后销毁鼠标关节。
if (mouseJoint)
{
world.DestroyJoint(mouseJoint);
mouseJoint = null;
}
 

运行结果: