0

我在游戏中使用了 Aurélien Ribon 的 LibGDX Project Setup。它通过以下方式创建相机:

public void create() {      
    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();
    camera = new OrthographicCamera(1, h/w);

我喜欢它,它使精灵的定位更容易,因为我的水平轴范围从 -0.5 到 0.5,垂直轴范围从 -0.5*screenHeight 到 0.5*screenHeight。

但是,我相信它会导致 Box2d 出现一些问题。我正在尝试创建一个弹跳球,我执行以下操作:

BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(0, 0); //center of screen
    ballBody = world.createBody(bodyDef);
    dynamicCircle = new CircleShape();
    dynamicCircle.setRadius(0.02f);  // really small body size
    ballFixture = new FixtureDef();
    ballFixture.shape = dynamicCircle;
    ballFixture.density = 0.5f;
    ballFixture.restitution = 0.9f;
    ballBody.createFixture(ballFixture);

屏幕底部附近还有地面静止体。问题是,那个球反弹了几次,然后在最后(当反弹应该非常低且频繁时)它只是着陆并且没有移动。

我相信这与我的世界单位(水平轴上的 1 个单位)有关。如何保持当前的世界设置并获得正确的 Box2d 物理?

4

2 回答 2

0

在你的类中声明这些变量

static final float BOX_STEP = 1 / 60f;
static final int BOX_VELOCITY_ITERATIONS = 6;
static final int BOX_POSITION_ITERATIONS = 0;
static final float WORLD_TO_BOX = 0.01f;
static final float BOX_WORLD_TO = 100f;

但我认为主要问题是

ballFixture.restitution = 0.9f;

把其他一些更高的价值归还,我想你会得到很好的结果......

;

于 2013-10-05T05:59:18.230 回答
0

这些尺寸太小,无法很好地与 Box2D 在计算形状之间的重叠、最大速度以及在您的情况下导致反弹所需的最小速度等事物时使用的默认值配合使用。

您可以更改所有默认值(在 b2Settings.h 中),但最好只扩大用于物理世界的所有维度。理想情况下,您希望场景中最常见的动态物体大小约为 1 个物理单位,因此您可以将所有内容按比例放大 25 左右。

这只是意味着您将在设置时将您提供给 Box2D 的每个维度和位置乘以该因子,并将 Box2D 提供给您的每个维度和位置(例如来自 GetPosition 等)除以相同的因子,然后再将其与其余部分一起使用你的游戏。

你会发现这改变了球的行为,因为现在它是大石头而不是小卵石的大小,所以重力对它的影响似乎更慢,感觉更飘。这可以通过增强重力来解决。

于 2013-10-06T16:22:34.637 回答