我的问题是,无论调整我都没有达到快速移动的球。它漂浮在空中而不是通过它射击。
在下面的方法中,我创建了一个半径为5
个单位的球。将半径设置为0.01
不会产生结果差异。
在创作之后我应用了LinearImpulse
个荒谬的比例,球只漂浮了。
(另外,我正在使用DebugRender。这不应该用于处理单位转换吗?)
Ball class
public Body createBody(float x, float y, float w, float h) {
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(x,y);
Body body = this.getWorld().createBody(bodyDef);
CircleShape shape = new CircleShape();
shape.setRadius(5);
shape.setPosition(new Vector2(0, 0)); // relative to body position
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 3f;
fixtureDef.friction = 0.1f;
fixtureDef.restitution = 0.8f;
body.createFixture(fixtureDef);
shape.dispose();
// note the massive impulse vector
body.applyLinearImpulse(new Vector2(10000, 100000), body.getWorldCenter(), true);
return body;
}
render method in Game class
@Override
public void render(){
Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
debugRenderer.render(world, camera.combined);
// time step, velocityIterations, positionIterations
world.step(1/40.0f, 6, 2);
// scheduler takes care of creating game objects on the fly
}
答案 0 :(得分:3)
好的,连同我对这个问题的回答Is there an upper limit on velocity when using box2d?我会尝试解释你的问题。
Box2D对速度有一个硬限制,每步时间为2米。这意味着您每秒执行的次数越多,您的Bodies就能越快移动。但是,由于您实际上希望每秒具有固定的时间步长,因此通常不能选择更多的时间步。
这意味着box2d中的1米应以屏幕为单位转换为16或128像素。这将提高整体精度,因为Box2D在较小范围内更精确。如果您的比例为1:1,则意味着这些天的标准屏幕将跨越1980m x 1080m的范围,这定义太多了。你还可以看到,60fps = 60次步长=每秒60 * 2m的最大距离,在最大速度下每秒只需120pixels。这就是你目前作为漂浮体所经历的事情。
例如,如果你将1m翻译成16px,你的最大速度将增加到120px * 16 = 7200px每秒。在我猜的情况下,这已经足够了。
此外,您还应将body.bullet
设置为true
,以提高快速移动的物体的碰撞精度。
答案 1 :(得分:1)
其中一个原因是世界规模,如果它很大,你可能会有一个非常大的世界规模。
它建议为了更好的准确性,使用set bullet为true,但需要更多的计算
body.bullet = true;