2017-10-09 104 views
0

我正在使用LibGDX创建Java桌面2D游戏。Box2D - 物理受控运动

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

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

此外,在移动时会敲你走单一的冲动,但你继续前进(见图片中红色部分)

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


所以我需要应用恒定的力量,在下一步之后仍然可以访问(和可移动)。
我可以用Box2D来做这个吗?
- 如果是,如何?
- 如果否,可以执行此操作的任何其他库?我并不需要像这样的密度和东西,图像中的用例几乎是我所需要的(+碰撞检测)。

image for visualization

* A磁体将是一个身体不断拉其他机构在一定范围内,以本身
* Kockback也只是一个简单的脉冲或与物体的射弹的碰撞。



编辑:如果你知道绑定以撒的,多数民众赞成在还挺物理学我的目标。

+0

我会叫'applyForceToCenter()'根据磁铁的距离和方向每次迭代在实体上。 –

回答

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); 
} 
+0

好的,谢谢你,这意味着我仍然需要自己做很多事情。 我会尝试你的解决方案,并接受它,如果它的作品。 我不妨上传一个磁铁和一些东西,一旦我创建它们的类。 – Lahzey

+0

它的工作,谢谢。虽然有些事情是错误的,但必须做一些编辑。 – Lahzey

+0

受磁铁和材料影响的受控恒定运动的问题仍未得到答复,但我会更加努力地研究这个问题,或许会为这个主题创造一个新问题。 – Lahzey