body 在任何重力下缓慢下落
body falls slowly in any gravity
我创建了一个具有地球引力的世界,我在场景中放置了一个实体(包含一个精灵和一个 Body),它像气球一样慢慢落下。
这是我设置世界的方式:
world = new World(new Vector2(0, -GRAVITY_EARTH), true);
这里是 Body 等的相关 Box2D 代码:
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(positionX, positionY);
// Create our body in the world
body = world.createBody(bodyDef);
// Grab the first idle sprite to use as initial
Sprite sprite = idleSprites.get(0);
// Create a box shape to represent our hit box
PolygonShape box = new PolygonShape();
box.setAsBox(sprite.getWidth() / 2f, sprite.getHeight() / 2f);
// Create a fixture definition to apply our shape
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = box;
fixtureDef.density = 1f; // Give it full density
fixtureDef.friction = 0f; // Give it no friction
fixtureDef.restitution = 0f; // Make it not bouncy
// Create our fixture and attach it to the body
fixture = body.createFixture(fixtureDef);
// Remember to dispose of any shapes after you're done with them!
// BodyDef and FixtureDef don't need disposing, but shapes do.
box.dispose();
以及我如何绘制精灵:
TextureRegion keyFrame = idleAnimation.getKeyFrame(stateTimeSeconds, true);
Vector2 position = body.getPosition();
batch.draw(keyFrame, position.x - keyFrame.getRegionWidth() / 2f, position.y - keyFrame.getRegionHeight() / 2f);
以及render()方法中的相关代码:
@Override
public void render () {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
final float deltaTime = Gdx.graphics.getDeltaTime();
camera.update();
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.begin();
spriteBatch.draw(sky, 0, 0);
tim.animate(spriteBatch, deltaTime);
spriteBatch.draw(floor, 0, 0);
spriteBatch.end();
// Render physics for debug
debugRenderer.render(world, camera.combined);
// Run physics
doPhysicsStep(deltaTime);
}
private void doPhysicsStep(float deltaTime) {
// fixed time step
// max frame time to avoid spiral of death (on slow devices)
float frameTime = Math.min(deltaTime, 0.25f);
accumulator += frameTime;
while (accumulator >= TIME_STEP) {
world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
accumulator -= TIME_STEP;
}
}
我试过改变灯具的密度,我试过改变重力值,我试过改变 TIME_STEP 但没有任何效果。 body就像气球一样缓缓落下
在我看来,您正在使用像素作为单位,box2d 将每个单位都视为米,因此您达到了每个时间步长 2.0 个单位的内部限制,请参阅 http://www.iforce2d.net/b2dtut/gotchas。您可以通过以世界单位而不是像素设置相机来解决这个问题,但是您必须缩放所有精灵和位置以适应世界单位而不是像素。
像这样的事情可能会做:
float w = (float) Gdx.graphics.getWidth();
float h = (float) Gdx.graphics.getHeight();
camera = new OrthographicCamera(30, 30 * (h / w));
此处设置相机的方式允许视口的高度根据屏幕的纵横比可变。
然后设置 sprite 按设置的系数更改它
sprite.setSize(sprite.getWidth / PIX2M, sprite.getHeight / PIX2M);
其中 PIX2M 是一个静态字段,定义了 box2d 中一米有多少个像素
或者,您可以将 sprite 的尺寸明确设置为一个具有物理意义的值,并与原始图像的纵横比(我个人的偏好)。因此,例如 100 x 500 的人物图像可以这样设置。
sprite.setSize(.4f, 2f);
表示此人高 2 米,宽 .4 米。此外,使用此方法,您不需要 PIX2M 转换因子,并且您将始终知道 body 的确切大小。由于您将相机设置为特定数量的世界单位,在这种情况下为 30,因此无论显示器的分辨率如何,精灵都会在屏幕上占据相同数量的空间。
我创建了一个具有地球引力的世界,我在场景中放置了一个实体(包含一个精灵和一个 Body),它像气球一样慢慢落下。
这是我设置世界的方式:
world = new World(new Vector2(0, -GRAVITY_EARTH), true);
这里是 Body 等的相关 Box2D 代码:
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(positionX, positionY);
// Create our body in the world
body = world.createBody(bodyDef);
// Grab the first idle sprite to use as initial
Sprite sprite = idleSprites.get(0);
// Create a box shape to represent our hit box
PolygonShape box = new PolygonShape();
box.setAsBox(sprite.getWidth() / 2f, sprite.getHeight() / 2f);
// Create a fixture definition to apply our shape
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = box;
fixtureDef.density = 1f; // Give it full density
fixtureDef.friction = 0f; // Give it no friction
fixtureDef.restitution = 0f; // Make it not bouncy
// Create our fixture and attach it to the body
fixture = body.createFixture(fixtureDef);
// Remember to dispose of any shapes after you're done with them!
// BodyDef and FixtureDef don't need disposing, but shapes do.
box.dispose();
以及我如何绘制精灵:
TextureRegion keyFrame = idleAnimation.getKeyFrame(stateTimeSeconds, true);
Vector2 position = body.getPosition();
batch.draw(keyFrame, position.x - keyFrame.getRegionWidth() / 2f, position.y - keyFrame.getRegionHeight() / 2f);
以及render()方法中的相关代码:
@Override
public void render () {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
final float deltaTime = Gdx.graphics.getDeltaTime();
camera.update();
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.begin();
spriteBatch.draw(sky, 0, 0);
tim.animate(spriteBatch, deltaTime);
spriteBatch.draw(floor, 0, 0);
spriteBatch.end();
// Render physics for debug
debugRenderer.render(world, camera.combined);
// Run physics
doPhysicsStep(deltaTime);
}
private void doPhysicsStep(float deltaTime) {
// fixed time step
// max frame time to avoid spiral of death (on slow devices)
float frameTime = Math.min(deltaTime, 0.25f);
accumulator += frameTime;
while (accumulator >= TIME_STEP) {
world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
accumulator -= TIME_STEP;
}
}
我试过改变灯具的密度,我试过改变重力值,我试过改变 TIME_STEP 但没有任何效果。 body就像气球一样缓缓落下
在我看来,您正在使用像素作为单位,box2d 将每个单位都视为米,因此您达到了每个时间步长 2.0 个单位的内部限制,请参阅 http://www.iforce2d.net/b2dtut/gotchas。您可以通过以世界单位而不是像素设置相机来解决这个问题,但是您必须缩放所有精灵和位置以适应世界单位而不是像素。
像这样的事情可能会做:
float w = (float) Gdx.graphics.getWidth();
float h = (float) Gdx.graphics.getHeight();
camera = new OrthographicCamera(30, 30 * (h / w));
此处设置相机的方式允许视口的高度根据屏幕的纵横比可变。
然后设置 sprite 按设置的系数更改它
sprite.setSize(sprite.getWidth / PIX2M, sprite.getHeight / PIX2M);
其中 PIX2M 是一个静态字段,定义了 box2d 中一米有多少个像素
或者,您可以将 sprite 的尺寸明确设置为一个具有物理意义的值,并与原始图像的纵横比(我个人的偏好)。因此,例如 100 x 500 的人物图像可以这样设置。
sprite.setSize(.4f, 2f);
表示此人高 2 米,宽 .4 米。此外,使用此方法,您不需要 PIX2M 转换因子,并且您将始终知道 body 的确切大小。由于您将相机设置为特定数量的世界单位,在这种情况下为 30,因此无论显示器的分辨率如何,精灵都会在屏幕上占据相同数量的空间。