我想用手指或鼠标拖动动态对象,这样就不会破坏碰撞检测,
body.setTransform()行为是我需要的东西,但是当我使用它时,碰撞不起作用,我可以通过静态物体移动身体。
我尝试使用mousejoint但是我不知道它是如何工作的,有些人建议检查box2d testbed来理解mousejoint但它对我来说变成了噩梦,我想我缺少一些基本的东西。
我也试过了applyForce和applyLinearImpulse但是我不明白它们是如何工作的,我不能将身体移动到鼠标方向,它只是在这里和那里反弹而我无法预测它的行为。
现在我认为我对box2d缺乏一些基本的了解,我必须学习基本的想法但是在我这样做之前我需要很快完成这个事情,并且源代码的好例子会很棒或者说明如何实现拖动对象使用其中一种或任何其他方法。
感谢。
答案 0 :(得分:1)
编辑 - 首先讨论setTransform
你应该知道的第一件事是setTransform基本上会关闭你正在搞乱的对象的box2D物理。因此,如果您希望您的运动看起来平滑自然,那么尽可能避免使用此方法是个好主意(尽管它有其用途)。
我对Android手势并不了解,但这就是我用鼠标做的方法。除了你正在检测触地而不是鼠标点击之外,它可能没什么不同。
获取x中的更改和y坐标的更改。称之为delta x和delta y。你可以在你的gdx渲染方法中最容易地做到这一点(虽然有些人会不理想),每隔几毫秒更新一次。
根据delta x和deltay获取角度theta。由于tan(theta)= deltay / deltax,因此arctan(deltay / deltax)将以弧度为单位给出你的角度θ。
了解如何检测您的对象是否已被点击并保持不变。我会使用现有的java方法来检测一组坐标是否在一个形状内。我很确定libGDX在它们的形状库中有一些类似的功能,但如果没有,只需使用java形状并将它们与游戏对象同步。 Box2d也可能有这方面的方法。这不是一个难以解决的问题。
在被操纵对象的box2d主体上使用此box2d方法:
myObjectBody.applyForceToCenter(new Vector2((float)Math.cos(myMouseDirectionAngle)
* forceYouWantToApply, (float)Math.sin(myMouseDirectionAngle) * forceYouWantToApply));
注意:您可能还需要通过将applyForceToCenter方法的wake参数设置为true来将对象的主体设置为“唤醒”。