了解LibGDX坐标系和绘制精灵

时间:2013-10-13 20:45:41

标签: libgdx

所以我开始使用LibGDX作为我的第一个OUYA和PC的机器人标题,但我遇到了一些与LibGDX的障碍。 (我的所有问题都可以通过查看来源来回答,但我也真的想了解设计选择。)

首先,坐标系。我使用Project Setup jar创建了一个项目,它创建了一个像这样的OrthographicCamera

camera = new OrthographicCamera(1, h/w);

从我的阅读中,我知道LibGdx使用左下角为0,0和yUp。精细。 我知道如果我愿意,可以很容易地改为y,但我不理解创建的下一段代码。

对于创建的默认子画面,位置设置如此。

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绘图似乎比应该更加混乱!

我还想注意,我计划使用脊椎来制作动画。这会改变我的选择使用y-up还是y-down?

4 个答案:

答案 0 :(得分:7)

如果要在屏幕中心绘制精灵,请在create method

中执行此操作
logosprite.setposition(scrw/2-logosprite.getwidth()/2,scrh/2-logosprite.getheight/2);

这里scrw是你的视口的宽度,

和scrh是你视口的高度,

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

sprite.setsize用于设置精灵的大小,当我们缩放大/小纹理以使其质量在所有设备中保持良好时使用sprite.setscale(hdpi.mdpi,xhdpi,ldpi) ..

如果您使用的是脊椎,它无需担心它在libgdx中运行顺畅..

答案 1 :(得分:1)

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

    logoSprite.setPosition(Gdx.graphics.getWidth()/2 - image.getWidth()/2, 
Gdx.graphics.getHeight()/2 - image.getHeight()/2);

将精灵置于屏幕中间位置“image”是您最初加载/声明的纹理。

至于为什么它出现奇怪的位置是因为你正在使用相机。 这会改变视图,只需浏览libgdx关于相机here

的文档

答案 2 :(得分:0)

在我的情况下,我需要设置相机的位置,然后调用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();

中调用此方法

答案 3 :(得分:0)

第1步:将子图形原点设置为您希望其旋转的位置。

// camera center point is (c.x, c.y)
logoSprite.setOrigin(c.x, c.y);

第2步:确保将精灵中心设置为原点

logoSprite.setOriginCenter();

第3步:旋转精灵

logoSprite.setRotation(Angle);

第4步:设置精灵位置,[减去精灵宽度和高度的一半以使精灵居中]

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