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

Java Libgdx Box2D-在身体上绘制精灵-严重问题,java,libgdx,box2d,sprite,physics,Java,Libgdx,Box2d,Sprite,Physics,我在Box2D身体上画精灵时遇到了很多麻烦 我在创造一个平台,我以前在一个物体上画过一个精灵,但后来意识到我的重力真的是漂浮的。谷歌搜索后,我发现我应该在使用Box2D时使用米,我将代码改为像素米转换率为25 从那以后,我就不能让所有的东西都工作了,我的雪碧就不会在我身上画了 摄像机: float width = Gdx.graphics.getWidth() * PIXELS_TO_METERS; float height = Gdx.graphics.getHeight() * PIXELS

我在Box2D身体上画精灵时遇到了很多麻烦

我在创造一个平台,我以前在一个物体上画过一个精灵,但后来意识到我的重力真的是漂浮的。谷歌搜索后,我发现我应该在使用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);
下面是我如何画我的精灵:

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

这是“像素在游戏世界中不存在”的另一种情况,它们只在那里向客户表示游戏世界。电视摄像师需要了解你的电视,就像你需要了解你客户的屏幕一样。只需捕获您想要显示的内容,然后让LibGDX完成其余的工作

所以,你永远不应该使用像素。如果您想要像素完美的绘图,您可能希望将相机设置为目标屏幕的像素量,但之后将这些“像素”视为单位

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

如果你想画一个1m x 1m的长方体,你应该乘以你现在所做的基于屏幕像素创建的一些数字,你应该给它
1x1
来表示长方体

shape.setAsBox(1, 1);
你的雪碧应该完全一样

 xeonSprite.setSize(1, 1);
你应该把它们放在同一个位置上。这真的很简单,
1个单位==1m
,除此之外没有什么了,剩下的就由相机来完成。如果你想展示你游戏世界的9米x 16米,你可以这样设置你的相机

camera = new OrthographicCamera(9, 16);
如果你想表现帝国大厦,你会给身体和精灵一个大小为57443的,然后你的相机需要表现一个更大的区域,如果你不想表现它的一小部分。如果你想在不拉伸的情况下精确地适应屏幕上的高度,你需要自己的转换

float camHeight = 443;
float aspectRatio = Gdx.graphics.width / Gdx.graphics.height
float camWidth = aspectRatio * 443;
虽然那些
Gdx
调用给出了你的客户端正在运行的像素,但是你仍然不应该将这些视为这些像素,因为你不知道我将在哪个屏幕上玩你的游戏

现在,忘记帝国大厦的例子,您的相机的中心位于
0,0
世界空间,因此左下角位于
-4.5,-8
,因此您可能需要翻译它,并且不要忘记
。更新
相机。您当前正在代码中执行此操作

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


只需忘记像素,除非您想为自己的相机或视口编码,因为您选择了LibGDX,所以可能不希望这样。游戏代码的其余部分不需要以任何方式处理像素。
正交摄影机
可以通过
摄影机为您计算世界位置到屏幕位置。取消投影(触摸向量)

不要使用像素到米的对话,只需正确设置摄影机即可。例如,如果您想在屏幕上看到x方向100米,则相机的宽度应为100米。摄像头在引擎盖下为您进行像素到米的对话。一个更好的解决方案是使用
视口
,阅读wiki以获取更多信息。还可以添加一些简单的方法来大量缩小/放大,以查看精灵是否由于缩放错误或未设置中心等原因“在某处/巨大/微小”。