2

我想用手指或鼠标拖动动态对象,以免破坏碰撞检测,

body.setTransform() 行为正是我所需要的,但是当我使用它时,碰撞不起作用,我可以通过静态物体移动身体。

我尝试使用mousejoint,但我无法弄清楚它是如何工作的,有些人建议检查box2d testbed 以了解mousejoint,但这对我来说变成了噩梦,我认为我缺少一些基本的东西。

我也尝试过 applyForce 和 applyLinearImpulse 但我不明白它们是如何工作的,我无法将身体移动到鼠标方向,它只是在这里和那里反弹,我无法预测它的行为。

现在我认为我对 box2d 缺乏一些基本的了解,我必须学习基本的想法,但在我这样做之前,我需要非常快速地完成这件事,并且带有源代码的好例子会很好,或者解释一下我如何用其中之一实现拖动对象这些或任何其他方法。

谢谢。

4

1 回答 1

1

编辑 - 先说 setTransform

您应该知道的第一件事是 setTransform 本质上关闭了您正在处理的对象上的 box2D 物理。因此,如果您希望您的动作看起来流畅自然,最好尽可能避免这种方法(尽管它有其用途)。

我对android手势了解不多,但这就是我用鼠标做的方式。除了您检测的是触地而不是鼠标点击之外,它可能没有太大的不同。

  1. 获取 x 的变化和 y 坐标的变化。称其为 delta x 和 delta y。您可以在您的 gdx 渲染方法中最容易地做到这一点(尽管有些人认为不理想),每隔几毫秒更新一次。

  2. 根据您的 delta x 和 deltay 获取角度 theta。由于 tan(theta) = deltay/deltax,那么 arctan(deltay/deltax) 将为您提供以弧度为单位的角度 theta。

  3. 了解如何检测您的对象是否已被点击并按住。我会使用现有的 java 方法来检测一组坐标是否在一个形状内。我很确定 libGDX 在他们的形状库中有一些类似的功能,但如果没有,只需使用 java 形状并将它们与您的游戏对象同步。Box2d 也可能有这方面的方法。这不是一个很难解决的问题。

  4. 在被操作对象的 box2d 主体上使用这个 box2d 方法:

    myObjectBody.applyForceToCenter(new Vector2((float)Math.cos(myMouseDirectionAngle) 
    * forceYouWantToApply, (float)Math.sin(myMouseDirectionAngle) * forceYouWantToApply));
    

注意:您可能还需要通过将 applyForceToCenter 方法的唤醒参数设置为 true 来将对象的主体设置为“唤醒”。

于 2013-07-15T07:26:29.583 回答