【问题标题】:Drag Box2d Bodies on Touch触摸时拖动 Box2d 实体
【发布时间】:2013-11-12 08:35:43
【问题描述】:
我有两个 box2d 实体,一个是静态的,另一个是动态的。现在我通过b2revoluteJoint 加入了静态体和动态体。所以我的问题是:
1) 我如何在touchMoved 上移动动态主体以及附加在动态主体上相同位置的静态主体。
2) 我如何移动两个以上的物体。假设我有一个人体,腿和手与b2RevoluteJoint 相连。现在我怎样才能将所有的身体一起移动以创造一个自然的外观。
我是 box2d 的新手,所以遇到了一些困难。任何人请帮助我解决这个问题。谢谢!
【问题讨论】:
标签:
c++
iphone
cocos2d-iphone
box2d
【解决方案1】:
您可以使用 MouseJoint 来移动动态主体,但该动作可能看起来不“自然”。
您可以使用“Seek”行为将单个实体移向接触点。您将需要限制您希望身体移动的速度,并将屏幕上的触摸点转换为 box2d 世界空间中的一个点。完成此操作后,您可以使用如下所示的功能将身体移向触摸点。在每个物理更新周期对您的实体调用此操作。
void MoveToTarget()
{
// Get the distance to the target.
Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter();
toTarget.Normalize();
Vec2 desiredVel = GetMaxSpeed()*toTarget;
Vec2 currentVel = GetBody()->GetLinearVelocity();
Vec2 thrust = desiredVel - currentVel;
GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust);
}
我已经成功地将它用于导弹和移动物体,并取得了一些成功(see blog post here)。源代码也可以在网站上找到。
您可以使用纯物理连接多个物体并移动它们。但这真的很难。我在为另一个项目创建蜘蛛时遇到了类似的问题,发现最好使用 2-D 骨骼动画工具 (Spine),然后放置一个合理的形状(蜘蛛真的很大,所以球体可以很好地处理它) box2d 中的 body 来处理它的移动和碰撞检测。
另一方面,我使用一系列由旋转关节连接的球创建了一条蛇。使用第一个(最大)球的搜索行为,运动看起来非常好。
这有帮助吗?
【解决方案2】:
1) box2d 中用于拖动对象的是 mouseJoint。在 touchBegan 中,您使用要移动的对象和任何静态体(例如 groundBody)创建鼠标关节,但在此关节中,这可以是每个静态体。在 touchMoved 中,您可以更改 mouseJoint 的位置。在 touchEnded 破坏关节:)
2) 你可以创建更多的 revoluteJoints,例如腿和主体是连接的,手臂和主体也是连接的。