我在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();
答案 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)
为您计算世界位置以屏蔽位置。