了解LibGDX坐标系和绘制精灵

了解LibGDX坐标系和绘制精灵,libgdx,Libgdx,因此,我非常激动地开始使用LibGDX作为我在OUYA和PC上的第一个android标题,但我在使用LibGDX时遇到了一些障碍。(我所有的问题都可以通过查看源代码来回答,但我也在努力理解设计选择) 首先是坐标系。我使用项目设置jar创建了一个项目,它创建了一个正交摄影机,如下所示 camera = new OrthographicCamera(1, h/w); 从我的阅读中,我了解到LibGdx使用左下角表示0,0和yUp。好的 我知道如果我想的话,很容易改成y down,但是我不理解创建的

因此,我非常激动地开始使用LibGDX作为我在OUYA和PC上的第一个android标题,但我在使用LibGDX时遇到了一些障碍。(我所有的问题都可以通过查看源代码来回答,但我也在努力理解设计选择)

首先是坐标系。我使用项目设置jar创建了一个项目,它创建了一个正交摄影机,如下所示

camera = new OrthographicCamera(1, h/w);
从我的阅读中,我了解到LibGdx使用左下角表示0,0和yUp。好的 我知道如果我想的话,很容易改成y down,但是我不理解创建的下一段代码

对于创建的默认精灵,位置设置如下

logoSprite.setOrigin(logoSprite.getWidth()/2, logoSprite.getHeight()/2);
logoSprite.setPosition(-logoSprite.getWidth()/2, -logoSprite.getHeight()/2);
当我运行这个基本程序时,我看到我添加的徽标图像在屏幕上居中。我试图理解的是,为什么设置位置的值为负值,为什么使用精灵宽度和高度而不是视图端口的图形w和h?如果我更改屏幕的宽度和高度,那么图像将绘制在屏幕右下侧的某个奇数位置

我的下一个问题是sprite.setSize vs sprite.setScale。为什么两者之间存在差异?(它们似乎做了相同的事情,只是setScale使getWidth和getHeight保持不变)

由于我的游戏将大量使用2D相机进行平移、缩放和旋转,因此在开始编写任何代码之前,我会尽可能多地了解libgdx框架

顺便说一句,我有游戏开发和数学背景,我用XNA制作了几个2D和3D游戏。我发现LibGdx有点令人沮丧,因为它没有像我期望的那样抽象出OpenGL,到目前为止,我一直在试验的2D图形似乎比它应该的更令人困惑


我还想指出,我计划使用spine制作动画。这会改变我使用y-up或y-down的选择吗?

如果可能,您可以只使用此代码

    logoSprite.setPosition(Gdx.graphics.getWidth()/2 - image.getWidth()/2, 
Gdx.graphics.getHeight()/2 - image.getHeight()/2);
将精灵居中放置在屏幕中间,“图像”是您最初加载/声明的纹理

至于为什么会出现这种奇怪的情况,是因为你用的是相机。
如果你想在屏幕中央画一个精灵,在你的创建方法中做这件事

logosprite.setposition(scrw/2-logosprite.getwidth()/2,scrh/2-logosprite.getheight/2);
这里的scrw是视口的宽度

scrh是视口的高度

这样你的精灵就会在屏幕中央

sprite.setsize
用于设置sprite的大小,而
sprite.setscale
用于缩放大小纹理,以便在所有设备(hdpi.mdpi、xhdpi、ldpi)中保持良好的质量


如果您使用的是spine,则无需担心它在libgdx中运行平稳。

在我的例子中,我需要设置相机的位置,然后调用update()方法。 然后永远不要忘记相机的(0,0)是它的中心。一切都是这样安排的。我的相机代码:

   private void cameralariUpdateEt() {
        cameraGame.position.set(cameraGame.viewportWidth * 0.5f,
                cameraGame.viewportHeight * 0.5f, 0);
        cameraGame.update();

        cameraScore.position.set(cameraScore.viewportWidth * 0.5f,
                cameraScore.viewportHeight * 0.5f, 0);
        cameraScore.update();
    }

从render()内部调用此方法

步骤1:将精灵原点设置为希望其旋转的位置

// camera center point is (c.x, c.y)
logoSprite.setOrigin(c.x, c.y);
步骤2:确保将精灵中心设置为原点

logoSprite.setOriginCenter();
第三步:旋转你的雪碧

logoSprite.setRotation(Angle);
步骤4:设置精灵位置,[减去精灵宽度和高度的一半以使精灵居中]

logoSprite.setPosition(c.x - logoSprite.getWidth() / 2, c.y - logoSprite.getHeight() / 2)

谢谢你的回复。我希望通过将原点设置为纹理的中心来绘制图像时将图像居中。这就是它在XNA中的工作方式,但看起来LibGDX总是从左下角绘制,而不管原点如何。另一件事是相机在0,0,所以屏幕的中心是0,0。示例代码没有为您添加camera.update调用,因此未应用我对缩放位置所做的更改。我关于脊椎的问题与将摄影机切换到y向下直接相关。是否有一种方法可以像翻转区域一样翻转脊椎动画?是的,您可以翻转动画,在libgdx中,如果要翻转动画,我们只需将其放入精灵中,然后像下图一样翻转精灵。翻转(真、假);