了解 LibGDX 坐标系统和绘制精灵。

问题描述 投票:9回答:4

所以,我非常兴奋地开始使用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);

当我运行这个基本程序时,我看到我添加的logo图像在屏幕上居中。我想了解的是,为什么在设置位置时,数值是负数,为什么使用精灵的宽度和高度而不是视图端口的图形w和h?如果我改用屏幕的宽度和高度,那么图像就会被绘制在屏幕右下方的一些奇怪的位置。

我的下一个问题是sprite.setSize与sprite.setScale。为什么两者之间会有区别?它们看起来做的事情是一样的,除了setScale让getWidth和getHeight保持不变)。

因为我的游戏将大量使用 2D 摄像机来进行平移、缩放和旋转,所以在开始编写任何代码之前,我试图尽可能多地了解 libgdx 框架。

顺便说一下,我有游戏开发和数学背景,我已经用XNA做了几个2D和3D游戏。我发现LibGdx有点令人沮丧,因为它并没有像我期望的那样抽象掉OpenGL,而且到目前为止,我一直在试验的2D绘图似乎比它应该的更令人困惑!我想说的是,我正在使用LibGdx框架。

我还想说的是,我打算使用spine来制作动画。这是否应该改变我的选择,使用y-up或y-down?

libgdx
4个回答
7
投票

如果你想在屏幕中央画一个精灵,在你的创建方法中这样做。

logosprite.setposition(scrw/2-logosprite.getwidth()/2,scrh/2-logosprite.getheight/2);

这里scrw是你的视口宽度。

而 scrh 是你的视口高度。

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

sprite.setsize 用于设置精灵的大小,而 sprite.setscale 当我们缩放一个大的小型纹理时使用,这样它的质量在所有的设备上都能保持良好(hdpi.mdpi,xhdpi,ldpi)。

如果你使用的是spine,也不用担心,它在libgdx中可以顺利工作。


1
投票

如果可能的话,你可以只用这个代码

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

将精灵置于屏幕中央,其中 "image "是你最初加载的Texture。

至于为什么会出现在一个奇怪的位置,是因为你使用了一个摄像头,它改变了很多视图,请查看libgdx关于摄像头的文档。此处


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()里面调用这个方法


0
投票

第1步:将精灵的原点设置为你希望它旋转的位置。

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

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

logoSprite.setOriginCenter();

步骤3:旋转你的精灵

logoSprite.setRotation(Angle);

第四步:设置精灵的位置,【减去精灵宽度和高度的一半,使精灵居中】。

logoSprite.setPosition(c.x - logoSprite.getWidth() / 2, c.y - logoSprite.getHeight() / 2)
© www.soinside.com 2019 - 2024. All rights reserved.