libgdx坐标系渲染和触摸输入之间的差异

Bri*_*ins 11 java coordinates game-engine libgdx

我有一个呈现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"));
    }

    .
    .
}
Run Code Online (Sandbox Code Playgroud)

在渲染屏幕期间,如果用户触摸屏幕,我抓住触摸的坐标,然后使用这些来渲染角色图像.

@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);
}
Run Code Online (Sandbox Code Playgroud)

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

为什么是这样的?为什么坐标系会反转?我使用错误的对象来确定这个吗?

小智 17

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

x = Gdx.input.getX();     
y = Gdx.input.getY();
z=0;
Run Code Online (Sandbox Code Playgroud)

现在我传递这个向量camera.unproject(vector3).使用xy这个载体来绘制你的性格.


P.T*_*.T. 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);
Run Code Online (Sandbox Code Playgroud)

在固定相机工作时,它"向上游游泳"了一下.您将遇到其他渲染器(ShapeRenderer,字体渲染器等),这些渲染器也会默认为"错误"的相机,需要修复.