【问题标题】:Libgdx Box2D body and Sprite alignment issueLibgdx Box2D 身体和 Sprite 对齐问题
【发布时间】:2016-07-08 16:59:19
【问题描述】:

我对 Libgdx 框架有疑问。我尝试创建一个扩展 Sprite 的类,但是当我渲染它时,我意识到 body 与 sprite 纹理不一致。

这是显示问题的图像:

你可以看到下面的代码:

public class GamePlay implements Screen {

private GameMain game;
private OrthographicCamera mainCamera;
private Viewport viewport;

private OrthographicCamera b2dcam;
private Box2DDebugRenderer debugRenderer;
private World world;

private Texture background;

private Brick brick;
float timer = 0;


public GamePlay(GameMain game)
{
    this.game = game;

    mainCamera = new OrthographicCamera(GameInfo.WIDTH, GameInfo.HEIGHT);
    mainCamera.position.set(GameInfo.WIDTH/2, GameInfo.HEIGHT/2,0);

    viewport = new FitViewport(GameInfo.WIDTH, GameInfo.HEIGHT, mainCamera);

    b2dcam = new OrthographicCamera();
    b2dcam.setToOrtho(false, GameInfo.WIDTH/GameInfo.PPM, GameInfo.HEIGHT / GameInfo.PPM);
    b2dcam.position.set(GameInfo.WIDTH/2f, GameInfo.HEIGHT/2f, 0);

    debugRenderer = new Box2DDebugRenderer();
    world = new World(new Vector2(0,0), true);

    background = new Texture("BGS/GameBG.png");

    brick = new Brick(world, "my brick");
    brick.setBricksPosition(cgp(20), cgp(20));


}

//region Screen Methods
@Override
public void show() {

}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    game.getBatch().begin();
    game.getBatch().draw(background,0,0);
    brick.draw(game.getBatch());
    game.getBatch().end();

    debugRenderer.render(world, b2dcam.combined);

    world.step(Gdx.graphics.getDeltaTime(), 6,2);
}

@Override
public void resize(int width, int height) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    background.dispose();

}
//endregion


private float cgp(int gridPos)
{
    return gridPos * GameInfo.gridSize;
}}



public class Brick extends Sprite {

private World world;
private Body body;
private String name;
private Fixture fixture;

public  Brick(World world, String name)
{
    super(new Texture("Bricks/brick.png"));
    this.world = world;
    this.name = name;


}

void createBody()
{
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyDef.BodyType.DynamicBody;

    bodyDef.position.set((getX() - getWidth())/ GameInfo.PPM, (getY() + getHeight()/2)/ GameInfo.PPM);

    body = world.createBody(bodyDef);

    PolygonShape shape = new PolygonShape();

    shape.setAsBox((getWidth()/2)/GameInfo.PPM, (getHeight()/2)/GameInfo.PPM);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = shape;

    fixture = body.createFixture(fixtureDef);

    shape.dispose();

}

public void setBricksPosition(float x, float y)
{
    setPosition(x,y);
    createBody();
}

public void draw(SpriteBatch batch)
{
    batch.draw(this, getX(), getY());
}}

【问题讨论】:

标签: java libgdx box2d


【解决方案1】:

终于找到了解决办法。 问题的发生是因为我的 PPM 值。我将其设置为 100,当您将其划分为屏幕尺寸时,它不会成为整数。于是我把它改成了160,可以同时分800和480,问题就解决了。

【讨论】:

  • 您是否尝试将 PPM 设置为浮点数(例如 100.0f?) bodydef 位置是一个向量,它接受浮点数和精灵 getX 和 getWidth 返回浮点数。将 PPM 设置为只能被特定屏幕尺寸整除的 int 可能会在以后限制您。
  • 好的,谢谢彼得。这是正确的解决方案.. :)
【解决方案2】:

box2d 调试渲染(显示身体的实际位置)和你的精灵“非常接近”,所以我猜你离得不远,问题可能出在你计算/翻译 box2d 位置 vs . 屏幕位置 vs. 像素 vs. 米。

您进行 PPM 转换,这很好。我没有时间查看您的所有代码,但是由于这两项非常接近,请再次检查您的计算。这一行:

bodyDef.position.set((getX() - getWidth())/ GameInfo.PPM, (getY() + getHeight()/2)/ GameInfo.PPM);

引起了我的注意。就 y 而言,渲染调试和精灵是正确的,但在 x 上关闭。您的身高使用 getHeight()/2,但 getWidth 不除以 2。也许这就是您缺少的全部(也将 Width 除以 2)?

【讨论】:

  • 感谢您的回答,但我意识到我错误地删除了它。当我将它除以 2 时,结果也没有对齐。应该有另一个问题,但我无法得到它..
  • 好的,不确定您是否说您发布的代码与图像不符。无论如何,我仍然认为它在计算中。寻找有什么不同,或者只是尝试蛮力改变事物,直到它们“排队”。正如我所说,您已经很接近了,但我没有时间查看代码。例如,您减去 getWidth() 但添加 getHeight(),这也是我注意到的差异。 (我现在也在黑暗中刺伤)
  • 感谢您帮助彼得。我会再次检查代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
相关资源
最近更新 更多