LibGDX 有一个坐标系,其中 (0,0) 位于左下角。(像这张图片:http: //i.stack.imgur.com/jVrJ0.png)
这让我把头撞到了墙上,主要是因为我正在移植一个我已经用通常的坐标系制作的游戏(其中 0,0 在左上角)。
我的问题:有什么简单的方法可以改变这个坐标系吗?
LibGDX 有一个坐标系,其中 (0,0) 位于左下角。(像这张图片:http: //i.stack.imgur.com/jVrJ0.png)
这让我把头撞到了墙上,主要是因为我正在移植一个我已经用通常的坐标系制作的游戏(其中 0,0 在左上角)。
我的问题:有什么简单的方法可以改变这个坐标系吗?
如果您使用相机(您应该)更改坐标系非常简单:
camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
如果您使用 TextureRegions 和/或 TextureAtlas,除此之外您需要做的就是调用 region.flip(false, true)。
我们默认使用 y-up 的原因(您可以如上图所示轻松更改)如下:
我们在 libgdx 中使用 y-down 的唯一两个地方是:
同样,您可以使用相机或一点点矩阵数学轻松地将使用的坐标系更改为您想要的任何坐标系。
只是稍微扩展一下 badlogic 上面所说的内容,如果您使用的是 TextureAtlas(带有 TextureRegions),您需要翻转它们,正如 badlogic 所说,除了相机工作。如果您使用的是 TextureAtlas,则可以在加载图集后立即使用此代码:
String textureFile = "data/textures.txt";
atlas = new TextureAtlas(Gdx.files.internal(textureFile), Gdx.files.internal("data"));
// Let's flip all the regions. Required for y=0 is TOP
Array<AtlasRegion> tr = atlas.getRegions();
for (int i = 0; i < tr.size; i++) {
TextureRegion t = tr.get(i);
t.flip(false, true);
}
如果您想隐藏转换并且在设置一次后不考虑它,您可以创建一个继承您需要的所有功能的类,但在将坐标传递给其父类的函数之前先转换坐标。不幸的是,这将花费很多时间。
y' = height - y
您也可以创建一个对整个Coordinate
对象(或您正在使用的任何对象)进行简单转换的方法,并在每次操作之前调用它一次。
有趣的图形库,我会说。我从下面的链接中找到了这个评估:
另一个问题是Libgdx 的不同部分使用了不同的坐标系。有时轴的原点在左下角,y 轴向上,有时在精灵的左上角向下。绘制网格时,原点甚至位于屏幕中心。这导致了相当多的混乱和额外的工作,以便将所有内容都放在屏幕上的正确位置。
我刚刚创建了一个类,它扩展SpriteBatch
了某些方法,添加了y = Gdx.graphics.getHeight() - y - height
. 简单但有效。
我能够通过 OrthographicCamera 使用建议的翻转坐标系正确渲染纹理和字体。这是我所做的:
private SpriteBatch batch;
private BitmapFont font;
private OrthographicCamera cam;
private Texture tex;
@Override
public void create () {
batch = new SpriteBatch();
font = new BitmapFont(true);
font.setColor(Color.WHITE);
cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
tex = new Texture("badlogic.jpg");
}
@Override
public void dispose() {
batch.dispose();
font.dispose();
tex.dispose();
}
@Override
public void render () {
cam.update();
batch.setProjectionMatrix(cam.combined);
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "Test", 50, 50);
batch.draw(tex, 100, 100, tex.getWidth(), tex.getHeight(), 0, 0, tex.getWidth(), tex.getHeight(), false, true);
batch.end();
}
需要注意的重要事项是:
现在我们将看看我今晚晚些时候是否会回到这里进行编辑,以解决所有其他问题或发现。