Box2d鼠标交互

由于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;
}
 

运行结果:

转载于:https://www.cnblogs.com/pengyingh/articles/2433208.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值