拖动Box2d身体触摸

时间:2013-11-12 08:35:43

标签: c++ iphone cocos2d-iphone box2d

我有两个box2d主体,一个是静态的,另一个是动态的。现在我通过b2revoluteJoint加入了具有动态体的静态体。所以我的问题是:

1)如何在touchMoved上移动Dynamic Body以及附着在动态主体上相同位置的静态主体。

2)我如何移动两个以上的尸体。假设我有一个人体,腿和手与b2RevoluteJoint结合在一起。现在我如何将所有的身体移动到一起以创造自然的外观。

我在box2d中是全新的,所以遇到了一些困难。关于这个问题请任何人帮助我。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用MouseJoint移动动态主体,但动作可能看起来不“自然”。

您可以使用“搜寻”行为将单个身体移向触控点。您需要建立对身体移动速度的限制,并将屏幕上的触摸点转换为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)。源代码也可在网站上找到。

您可以连接多个实体并使用纯物理移动它们。但这很难真的。我有一个类似的问题为另一个项目创建蜘蛛,并发现最好使用二维骨架动画工具(Spine),然后只是铺设一个合理的形状(蜘蛛是非常大的斑点,所以一个球体很好地处理它)在box2d的主体上方处理移动它和碰撞检测。

另一方面,我用一系列通过旋转关节连接的球创造了一条蛇。通过对第一个(最大)球的搜索行为,动作看起来非常好。

这有用吗?

答案 1 :(得分:1)

1)在box2d中拖动对象是mouseJoint。在touchBegan中,您可以使用要移动的对象和任何静态体(例如groundBody)创建鼠标关节,但在此关节中,这可以是每个静态体。在touchMoved中,您可以更改mouseJoint的位置。在touchEnded中销毁联合:)

2)你可以创建更多的revoluteJoints,例如腿和主体连接,手臂和主体也连接。