所以我开始使用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?
答案 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)