【问题标题】: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,例如腿和主体是连接的,手臂和主体也是连接的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多