Box2D - 物理控制运动

时间:2017-10-09 15:15:14

标签: java libgdx box2d

我正在使用LibGDX创建一个Java桌面2D游戏。

我需要能够移动物体(由玩家用W / A / S / D控制)。
移动速度始终相同(从移动物体的场中读出)。

当他们移动时,他们仍应受物理影响。
这意味着当远离磁铁时会让你移动得更慢,朝着它移动会让你更快并且越过它将导致你移动一条曲线。 (见图像的蓝色部分)

同时移动中的一个冲动会让你离开,但你继续前进(见图像的红色部分)

你也应该能够改变方向或停止,只停止自己的运动,所以你仍然会受到物理的影响。


所以我需要在下一步之后应用仍然可以访问(和可移动)的恒定力。
我可以用Box2D做到这一点吗?
- 如果是,怎么样?
- 如果没有,任何其他图书馆都能做到这一点?我并不真的需要密度和类似的东西,图像中的用例几乎是我所需要的(+碰撞检测)。

image for visualization

*磁铁会不断地将其他物体拉到一定范围内
* Kockback只是一个简单的冲动或射弹与物体的碰撞。



编辑:如果你知道艾萨克的束缚,那就是我瞄准的那种物理。

1 个答案:

答案 0 :(得分:2)

设置磁铁影响的距离:

float magnetRadius = 30;

设置磁铁的吸引力:

float magnetForce = 400;

获得玩家和磁铁的位置:

Vector2 magnetPos = magnet.getWorldCenter();
Vector2 playerPos = player.getWorldCenter();

现在计算玩家和磁铁之间的距离:

Vector2 magnetDist = new Vector2((playerPos.x - magnetPos.x), (playerPos.y - magnetPos.y));
float distance = (float) Math.sqrt((magnetPos.x) * (magnetPos.x) + (magnetPos.y) * (magnetPos.y));

然后,如果玩家在磁铁的半径范围内,你必须向他施加一个力量,这取决于玩家与磁铁的距离:

if (distance <= magnetRadius) {
   float vecSum = Math.abs(magnetDist.x)+Math.abs(magnetDist.y);
   Vector2 force = new Vector2((magnetForce*magnetDist.x * ((1/vecSum)*magnetRadius/distance)), (magnetForce*magnetDist.y * ((1/vecSum)*planetRadius/distance)));
   player.applyForceToCenter(force, true);
}