Libgdx Box2D - 在身体上绘制精灵 - 重问题

时间:2014-10-30 14:47:13

标签: java libgdx box2d sprite physics

我在Box2D机身上画一个Sprite时遇到了很多问题。

我正在制作一个平台游戏,之前我确实在一个身上画了一个精灵,然后意识到我的引力真的很漂浮。在谷歌上搜索后,我发现在使用Box2D时我应该使用米,并且我将代码更改为使用像素到米的转换率为25。

从那时起,我无法让一切工作,但我的精灵不会吸引我的身体。

相机:

float width = Gdx.graphics.getWidth() * PIXELS_TO_METERS;
float height = Gdx.graphics.getHeight() * PIXELS_TO_METERS;

camera = new OrthographicCamera(width / 2, height / 2);
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
camera.update();

以下是我身体的代码:

idleRegion = new TextureRegion(xeonTexture, 20, 13, 50, 65);

xeonSprite = new Sprite(idleRegion);

    //Physics
bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(100 * PIXELS_TO_METERS, 100 * PIXELS_TO_METERS);
bodyDef.fixedRotation = true;
body = world.createBody(bodyDef);

PolygonShape shape = new PolygonShape();
shape.setAsBox((xeonSprite.getWidth() / 2) * PIXELS_TO_METERS, (xeonSprite.getHeight() / 2) * PIXELS_TO_METERS);

FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1f;
fixtureDef.friction = 1f;
fixtureDef.restitution = 0f;
fixtureDef.isSensor = false;

physicsFixture = body.createFixture(fixtureDef);

以下是我设置精灵位置的方法:

final float widthD2 = (xeonSprite.getWidth() / 2);
final float heightD2 = (xeonSprite.getHeight() / 2);
final float angle = this.getBodyAngle();

xeonSprite.setOrigin(widthD2, heightD2);
xeonSprite.setPosition(body.getPosition().x - xeonSprite.getWidth() / 2, body.getPosition().y - xeonSprite.getHeight() / 2);
xeonSprite.setRotation((float) Math.toRadians(angle));

我也尝试了以下内容:

xeonSprite.setPosition(body.getPosition().x - xeonSprite.getWidth() / 2 * METERS_TO_PIXELS, body.getPosition().y - xeonSprite.getHeight() / 2 * METERS_TO_PIXELS);

以下是我绘制Sprite的方法:

penguinBatch.begin();
xeon.getPenguinSprite(stateTime, Gdx.graphics.getDeltaTime()).draw(penguinBatch);
penguinBatch.end();

1 个答案:

答案 0 :(得分:1)

这是另一种情况"像素在您的游戏世界中不存在",它们只是代表您的游戏世界给您的客户。电视摄影师需要了解您的电视,因为您需要了解您的客户屏幕。只需抓住您想要展示的内容,让LibGDX完成其余的工作。

所以,你永远不应该使用像素。如果你想要像素完美的绘图,你可能想要将你的相机设置为你所瞄准的屏幕的像素数量,但之后你会对这些"像素"作为单位。

Box2D 使用每米像素。它适用于1 unit == 1 meter,你应该坚持这一点。但是像素应该代表多少米仍然取决于你。

如果你想画一个1米x 1米的盒子,你应该乘以你现在制作的基于屏幕像素的数字,你应该只给它1 x 1来表示盒子。

shape.setAsBox(1, 1);

你的精灵应该完全一样

 xeonSprite.setSize(1, 1);

你应该把它们放在同一个位置上。它真的那么简单,1 UNIT == 1m并没有更多的东西,相机完成其余的工作。如果你想展示9m x 16m的游戏世界,你可以像这样设置你的相机。

camera = new OrthographicCamera(9, 16);

如果你想代表帝国大厦你会给身体和精灵大小57, 443然后你的相机需要代表一个更大的区域,如果你不想渲染一个它的一小部分。如果你想在不拉伸的情况下在屏幕上精确调整高度,则需要自己进行转换。

float camHeight = 443;
float aspectRatio = Gdx.graphics.width / Gdx.graphics.height
float camWidth = aspectRatio * 443;

虽然这些Gdx来电会给出您的客户正在运行的像素,但您仍然不应将这些像素视为这些像素,因为您不知道我将在哪个屏幕上玩游戏。

现在忘记了帝国大厦的例子,你的相机的中心位于0, 0世界空间,所以左下角是-4.5, -8所以你可能想翻译它并且不要#39}忘了.update相机。您目前正在代码中执行此操作。

如果您开始绘制精灵并更新Box2D,您将看到从屏幕中心掉落的球。当然,您需要不断更新精灵位置以匹配身体位置,以便与Box2D身体一起移动。

忘记像素,除非您想编码自己的相机或视口,因为您选择了LibGDX,这可能是您不想要的。其余的游戏代码不需要以任何方式处理像素。 OrthographicCamera可以camera.unproject(touchVector)为您计算世界位置以屏蔽位置。