11

我有一个呈现 PNG 图像的屏幕(BaseScreen 实现 Screen 接口)。单击屏幕时,它将角色移动到触摸的位置(用于测试目的)。

public class DrawingSpriteScreen extends BaseScreen {
    private Texture _sourceTexture = null;
    float x = 0, y = 0;

    @Override
    public void create() {
        _sourceTexture = new Texture(Gdx.files.internal("data/character.png"));
    }

    .
    .
}

在屏幕渲染过程中,如果用户触摸屏幕,我会抓取触摸的坐标,然后使用这些坐标来渲染字符图像。

@Override
public void render(float delta) {
    if (Gdx.input.justTouched()) {
        x = Gdx.input.getX();
        y = Gdx.input.getY();
    }

    super.getGame().batch.draw(_sourceTexture, x, y);
}

问题是绘制图像的坐标从左下角开始(如 LibGDX Wiki 中所述),而触摸输入的坐标从左上角开始。所以我遇到的问题是我点击右下角,它将图像移动到右上角。我的坐标可能是 X 675 Y 13,触摸时它会在屏幕顶部附近。但是字符显示在底部,因为坐标从左下角开始。

为什么是什么?为什么坐标系颠倒了?我是否使用错误的对象来确定这一点?

4

4 回答 4

17

为了检测碰撞,我使用camera.unproject(vector3). 我设置vector3为:

x = Gdx.input.getX();     
y = Gdx.input.getY();
z=0;

现在我将这个向量传递给camera.unproject(vector3). 使用这个向量的xy来绘制你的角色。

于 2013-05-13T04:38:50.410 回答
6

你做对了。Libgdx 通常以“本机”格式提供坐标系(在这种情况下,本机触摸屏坐标和默认的 OpenGL 坐标)。这不会产生任何一致性,但它确实意味着库不必介入你和其他一切。大多数 OpenGL 游戏使用将相对任意的“世界”坐标映射到屏幕上的相机,因此世界/游戏坐标通常与屏幕坐标有很大不同(因此不可能保持一致性)。请参阅在 LibGDX (Java) 中更改坐标系

有两种方法可以解决此问题。一是转换你的触摸坐标。另一种是使用不同的相机(不同的投影)。

修复触摸坐标,只需从屏幕高度中减去 y。这有点骇人听闻。更一般地说,您想从屏幕“取消投影”到世界中(请参阅 Camera.unproject()变体)。这可能是最简单的。

或者,要修复相机,请参阅“在 LibGDX (Java) 中更改坐标系”,或libgdx 论坛上的此帖子。基本上,您定义了一个自定义相机,然后将其设置SpriteBatch为使用它而不是默认值。:

// Create a full-screen camera:
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
// Set it to an orthographic projection with "y down" (the first boolean parameter)
camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.update();

// Create a full screen sprite renderer and use the above camera
batch = new SpriteBatch(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
batch.setProjectionMatrix(camera.combined);

在修复相机工作时,它有点“逆流而上”。您会遇到其他渲染器(ShapeRenderer、字体渲染器等),这些渲染器也将默认使用“错误”的相机并且需要修复。

于 2013-05-13T05:08:52.270 回答
4

我有同样的问题,我只是这样做了。

public boolean touchDown(int screenX, int screenY, int pointer, int button) {

    screenY = (int) (gheight - screenY);
    return true;
}

并且每次您想从用户那里获取输入时,不要使用 Gdx.input.getY(); 而是使用对我有用的 (Gdx.graphics.getHeight()-Gdx.input.getY()) 。

于 2014-12-02T10:28:24.757 回答
1

下面的链接讨论了这个问题。

将世界空间中的给定坐标投影到屏幕坐标。

您需要project(Vector3 worldCoords)在类中使用该方法com.badlogic.gdx.graphics.Camera

private Camera camera;
............

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {

创建向量的一个实例并使用输入事件处理程序的坐标对其进行初始化。

    Vector3 worldCoors = new Vector3(screenX, screenY, 0);

将世界空间中给定的 worldCoors 投影到屏幕坐标。

    camera.project(worldCoors);

使用投影坐标。

    world.hitPoint((int) worldCoors.x, (int) worldCoors.y);

    OnTouch();

    return true;
}
于 2017-01-27T12:53:42.810 回答