所以,我非常兴奋地开始使用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?
如果你想在屏幕中央画一个精灵,在你的创建方法中这样做。
logosprite.setposition(scrw/2-logosprite.getwidth()/2,scrh/2-logosprite.getheight/2);
这里scrw是你的视口宽度。
而 scrh 是你的视口高度。
这样你的精灵就会在屏幕的中心位置
sprite.setsize
用于设置精灵的大小,而 sprite.setscale
当我们缩放一个大的小型纹理时使用,这样它的质量在所有的设备上都能保持良好(hdpi.mdpi,xhdpi,ldpi)。
如果你使用的是spine,也不用担心,它在libgdx中可以顺利工作。
如果可能的话,你可以只用这个代码
logoSprite.setPosition(Gdx.graphics.getWidth()/2 - image.getWidth()/2,
Gdx.graphics.getHeight()/2 - image.getHeight()/2);
将精灵置于屏幕中央,其中 "image "是你最初加载的Texture。
至于为什么会出现在一个奇怪的位置,是因为你使用了一个摄像头,它改变了很多视图,请查看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);
第二步:确保将精灵中心设置为原点。
logoSprite.setOriginCenter();
步骤3:旋转你的精灵
logoSprite.setRotation(Angle);
第四步:设置精灵的位置,【减去精灵宽度和高度的一半,使精灵居中】。
logoSprite.setPosition(c.x - logoSprite.getWidth() / 2, c.y - logoSprite.getHeight() / 2)