当前位置: 首页 > 知识库问答 >
问题:

Box2D-物理控制运动

庞书
2023-03-14

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

我需要能够移动物体(由带W/A/S/D的玩家控制)。< br >移动速度总是相同的(从移动对象的场中读出)。

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

此外,移动时的一次冲动会把你撞开,但你一直在移动(见图像的红色部分)

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

因此,我需要施加恒定的力,在下一步之后仍然可以接触到(并且可以移除)。< br >我可以用Box2D这样做吗?< br >-如果是,如何实现?< br >-如果没有,还有其他库可以做到这一点吗?我真的不需要密度之类的东西,图像中的用例几乎是我所需要的(碰撞检测)。

*磁铁是一个物体,它不断地将一定范围内的其他物体拉向自己
*回击只是一个简单的脉冲或射弹与物体的碰撞。



编辑:如果你知道《以撒的束缚》,这就是我所追求的那种物理学。

共有1个答案

许鸿志
2023-03-14

设置磁铁影响他的距离:

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);
}
 类似资料:
  • 世界重力设置为-9.81f增加重力改变球速,但我想成为一个“真正的”模拟。我在一篇帖子中读到,可能是因为像素与米的比例是1:1。但是我不知道如何在不破坏舞台的情况下改变这个比例。我将不胜感激。

  • 我试图使用精灵套件框架重写简单的游戏(由我前段时间使用Cocos2d Box2d开发)。在Sprite Kit中,一切看起来都简单得多,这很棒,但是我在调整新项目中的物理世界参数时遇到了问题。我注意到使用完全相同的图形图像创建的精灵(都有基本的基于矩形的主体)在精灵套件中的质量比在Cocos2d Box2d中的质量低四倍。将主体密度设置为 4 可以解决问题,不幸的是,这不是主要问题。看起来4倍乘数

  • 角色控制器 第一人称或第三人称游戏中的角色通常需要一些基于碰撞的物理特性,以使它不会穿过地板掉落下去或穿过墙壁。角色的加速度和运动通常不是物理真实的,它可以立即加速、制动和改变方向,而不会收到动量的影响。 在 3D 物理中,这种类型的行为可以使用 角色控制器 创建。这个组件给角色提供了简单的胶囊碰撞器,并且总是直立向上。控制器有着自己的特殊功能,可以用来设置对象的速度和方向,与真正的碰撞器不同的是

  • 嗨,伙计们, 我正在使用libgdx为android开发一个游戏。我完全陷入了探测两个物体碰撞的部分。我有一个我通过下面的函数创建的播放器 和我用玩家相同的功能创建的敌人,我只更改file_path和fixture_name。file_path指向我用box2d编辑器创建的. json文件(站点:http://www.aurelienribon.com/blog/projects/physics-

  • 我还有一个关于Python多处理的问题。我有一个模块,它创建了一个进程,并在while-True循环中运行。此模块将从另一个Python模块启用/禁用。另一个模块将导入第一个模块一次,并作为进程运行。 我该如何更好地实现这一点? 因此,作为参考: 想象第二个模块是这样的: 不断地运行一个流程来检查循环中的条件似乎是一种浪费,但我很乐意接受这样的解决方案,它只允许我从外部设置值。理想情况下,我希望能

  • 我就开门见山了。所以我在做这个游戏,你应该用你的咒语杀死其他物体。我创造了子弹和它们的身体。我们都很好。它正在工作。但我想让它看起来特别和“神奇”,所以我决定使用粒子。我制作了粒子,把它们放在子弹体后面,用下面的代码: 但当我发射多发子弹时,问题是粒子刚刚从我发射的所有第一发子弹中消失,并且只出现在最后一发子弹上。有人能给我介绍一下这个吗? -----------------编辑---------