因爲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;
}
運行結果:數組