繁体   English   中英

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

[英]Libgdx Box2D - Draw Sprite on Body - Heavy problems

我在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();

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

因此,永远不要使用像素。 如果您想要像素完美绘制,则可能需要将相机设置为目标屏幕的像素数量,但之后将这些“像素”作为单位来处理。

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

如果要绘制一个1m x 1m的框,则不要像现在这样乘以您根据屏幕像素创建的某个数字,而应该给它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调用提供了客户Gdx在运行的像素,但是您仍不应将这些像素视为这些像素,因为您不知道我将在哪个屏幕上玩游戏。

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

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

只需忘记像素,除非您想编写自己的相机或视口,因为选择LibGDX可能不希望这样做。 其余游戏代码无需以任何方式使用像素。 OrthographicCamera可以通过camera.unproject(touchVector)为您计算世界位置到屏幕位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM