Box2D - 物理控制运动
Box2D - Controlled Movement with Physics
我正在使用 LibGDX 创建 Java 桌面 2D 游戏。
我需要能够移动物体(由 W/A/S/D 的玩家控制)。
移动速度始终相同(从移动物体的一个字段中读出)。
虽然它们在移动,但它们应该仍会受到物理影响。
这意味着当远离磁铁时会让你移动得更慢,靠近它会让你更快,而越过它会让你移动曲线。 (见图片蓝色部分)
移动时的单一冲动也会将您击倒,但您会继续移动(参见图像的红色部分)
你也应该能够改变方向或停止,只是停止你自己的运动,所以你仍然会受到物理的影响。
所以我需要施加在下一步之后仍然可以访问(和移动)的恒定力。
我可以用 Box2D 做这个吗?
-如果是,如何?
-如果没有,还有其他图书馆可以做到这一点吗?我真的不需要密度之类的东西,图像中的用例几乎就是我所需要的(+ 碰撞检测)。
*磁铁就是一个物体不断地把一定范围内的其他物体拉向自己
*Kockback 只是一个简单的冲动或弹丸与物体的碰撞。
编辑: 如果你知道以撒的结合,那就是我的目标物理。
设置磁铁影响的距离:
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);
}
我正在使用 LibGDX 创建 Java 桌面 2D 游戏。
我需要能够移动物体(由 W/A/S/D 的玩家控制)。
移动速度始终相同(从移动物体的一个字段中读出)。
虽然它们在移动,但它们应该仍会受到物理影响。
这意味着当远离磁铁时会让你移动得更慢,靠近它会让你更快,而越过它会让你移动曲线。 (见图片蓝色部分)
移动时的单一冲动也会将您击倒,但您会继续移动(参见图像的红色部分)
你也应该能够改变方向或停止,只是停止你自己的运动,所以你仍然会受到物理的影响。
所以我需要施加在下一步之后仍然可以访问(和移动)的恒定力。
我可以用 Box2D 做这个吗?
-如果是,如何?
-如果没有,还有其他图书馆可以做到这一点吗?我真的不需要密度之类的东西,图像中的用例几乎就是我所需要的(+ 碰撞检测)。
*磁铁就是一个物体不断地把一定范围内的其他物体拉向自己
*Kockback 只是一个简单的冲动或弹丸与物体的碰撞。
编辑: 如果你知道以撒的结合,那就是我的目标物理。
设置磁铁影响的距离:
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);
}