当世界是1个单位宽时,Libgdx + Box2d不正确的物理

时间:2013-10-05 02:25:03

标签: box2d libgdx

我使用AurélienRibon的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物理?

2 个答案:

答案 0 :(得分: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;

在恢复原状方面还有其他更高的价值,我认为你会得到很好的结果......

答案 1 :(得分:0)

这些尺寸太小,无法与Box2D在计算形状,最大速度之间的重叠以及导致反弹所需的最小速度等事项时使用的默认值一起使用。

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

这只是意味着你在设置时会将你给Box2D的每个维度和位置乘以该因子,并在使用之前将Box2D给你的每个维度和位置(例如来自GetPosition等)除以相同的因子与你的其他游戏一起。

你会发现这会改变球的行为,因为现在它的大小是一块大石头,而不是一块小卵石,所以重力会更慢地影响它,它会感觉更加浮动。这可以通过使引力更强来抵消。