当前位置: 首页 > 知识库问答 >
问题:

与LibGDX和Box2d的接触不准确

袁炳
2023-03-14

虽然我真的很喜欢LibGDX Box2d魔法,但在我的第一个项目中调整一切是很痛苦的。

我现在面临的问题是,即使我的sprite和DebugRenderer对齐,但当我触摸屏幕(在Nexus 5上测试)时,我得到了错误的坐标。

第一个例子——蓝点是触摸点

在这张图中,我触摸的是形状外部,但我得到的坐标实际上在形状内部,因此测试点返回true:

TOUCH  126.25 253.0
ORIGIN 103.0  190.0
TIP    167.0  254.0
TEST   true

第二个例子-蓝点是接触点

在这张图像中,我触摸到了形状内部,但我得到的坐标实际上在形状外部,因此测试点返回false。

TOUCH  134.25 189.7
ORIGIN 103.0  190.0
TIP    167.0  254.0
TEST   false

相关代码非常简单:

    // width and height of my Nexus 5 in portrait mode are 1080 x 1776
    public static final float VIRTUAL_WIDTH = 270.0f;
    public static final float VIRTUAL_HEIGHT = 444.0f;

创建游戏:

public void create() {
    camera = new OrthographicCamera();
    camera.setToOrtho(false, VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
    camera.update();

    world = new World(new Vector2(0, 0), true);
    box = new Box(world, camera);
    ground = new Ground(world);
    leftWall = new Wall(world, Wall.LEFT);
    rightWall = new Wall(world, Wall.RIGHT);
    touchDebugger = new TouchDebugger();

    stage = new Stage();
    stage.setCamera(camera);
    stage.getSpriteBatch().setProjectionMatrix(camera.combined);
    stage.addActor(box);
    stage.addActor(ground);
    stage.addActor(leftWall);
    stage.addActor(rightWall);
    stage.addActor(touchDebugger);
    stage.addListener(box);
    stage.addListener(touchDebugger);
    Gdx.input.setInputProcessor(stage);

    debugRenderer = new Box2DDebugRenderer(true, true, true, true, true, true);
}

渲染代码:

public void render() {
    // Update the camera.
    camera.update();
    camera.apply(Gdx.gl10); // Don't know about that, just found over the internet

    // Clear LibGDX OpenGL context.
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    // Physics world step.
    world.step(1/45f, 6, 6);

    // Scene2d rendering.
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();

    // Physics debugging.
    debugRenderer.render(world, camera.combined);
}

我的方块接地:

public void touchDown(float x, float y) {
    Vector2 touch = new Vector2(x, y);
    Vector3 cam = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
    camera.unproject(cam);

    boolean test = fixture.testPoint(touch.x, touch.y);

    Log.d("demo", "GDX    " + Gdx.input.getX() + "\t" + Gdx.input.getY());
    Log.d("demo", "CAM    " + cam.x + "\t" + cam.y);
    Log.d("demo", "TOUCH  " + touch.x + "\t" + touch.y);
    Log.d("demo", "ORIGIN " + (body.getPosition().x - width/2.0f) + "\t" + (body.getPosition().y - height/2.0f));
    Log.d("demo", "TIP    " + (body.getPosition().x + width/2.0f) + "\t" + (body.getPosition().y + height/2.0f));
    Log.d("demo", "TEST   " + test);
}

试过那个摄像机。这是一些不现实的东西,但它给了我与触地得分的参数相同的值。

还实现了handle方法

public boolean handle(Event event) {
    String e = event.toString();
    if (e == "touchDown") {
        InputEvent ie = (InputEvent) event;
        touchDown(ie.getStageX(), ie.getStageY());
    } else if ( e == "touchUp") {
        InputEvent ie = (InputEvent) event;
        touchUp(ie.getStageX(), ie.getStageY());
    }

    return true;
}

(为了调试这个,我从box2d和世界坐标中删除了每个转换,然后在这个演示中使用1px=1m(我显然不是真的这样做!))

OBS:不精确也发生在X轴上。

共有1个答案

唐伟
2023-03-14

我假设你想要接触点的世界坐标?

如果是这样,则取消投影错误的向量,应使用:

Vector3 touch = new Vector3(x, y, 0);
camera.unproject(touch);

这会将屏幕坐标转换为世界坐标。然后获取转换后的坐标:

touch.x, touch.y
 类似资料:
  • 问题内容: 我刚刚开始使用libgdx创建游戏。它是使用scene2d ui的自上而下的2d射击游戏。现在我想,我可以在某些程度上增加黑暗和光明,但是我不想使用box2d重写所有内容。我不需要逼真的阴影,只需某种环境光和围绕我角色的光圈即可,不受周围墙壁和其他障碍物的影响。所以我想知道libgdx中是否有任何照明系统?或者我可以不使用box2d物体/世界而使用box2dlights吗?谢谢 问题答

  • 我想把它集成到libgdx中。Liquidfun看起来不错,但我听说它给可移植性带来了问题,而且不能很好地与桌面应用程序配合使用。根据我的理解,libgdx中的粒子效应并不遵循粒子所涉及的物理,所以我认为我也不应该走那条路。

  • 正如你从图像中看到的那样,身体与实际的精灵不同,我有一种预感,它可能是起源,因为它的区别很小,但我似乎不知道如何把它排成一行。 我的创建方法 我的渲染方法

  • 我正在使用ContactListener测试box 2D中两个物体之间的碰撞 这是我在世界上使用的所有contactListener类。设置ContactListener(new Box2DWorld(this))以添加它 我的dedub是这样的 beginContact preSolve postSolve。preSolve postSolve beginContact preSolve END

  • 我有一个非常简单的使用Box2d的LibGDX游戏。现在,它只是一艘在地图上移动的船。如果我使用方法来改变船的位置,我可以通过键盘控制让船移动,但这显然没有利用Box2d的功能。我想使用方法来控制玩家船,但由于某种原因,无论我设置的力有多高或多低,该方法都不做任何事情。我还尝试了和,两者都有相同的效果:什么都没有。我通过测井证实,我的船的速度实际上保持在恒定的0.0,而不仅仅是微小的变化。 以下是

  • 我就开门见山了。所以我在做这个游戏,你应该用你的咒语杀死其他物体。我创造了子弹和它们的身体。我们都很好。它正在工作。但我想让它看起来特别和“神奇”,所以我决定使用粒子。我制作了粒子,把它们放在子弹体后面,用下面的代码: 但当我发射多发子弹时,问题是粒子刚刚从我发射的所有第一发子弹中消失,并且只出现在最后一发子弹上。有人能给我介绍一下这个吗? -----------------编辑---------