2013-10-13 37 views
9

所以我非常激动地开始使用LibGDX作为OUYA和PC的第一个android标题,但是我遇到了一些与LibGDX有关的问题。 (我的所有问题都可以通过查看源代码来回答,但我真的很想了解设计选择)。了解LibGDX坐标系和绘图精灵

首先,坐标系。我创建使用项目设置罐子项目,并创建像这样

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

的OrthographicCamera从我读书,我明白LibGdx使用左下角为0,0和烨。精细。 我发现,如果我想要更改为y,但是我不理解创建的下一代代码。

对于创建的默认精灵来说,位置是这样设置的。

logoSprite.setOrigin(logoSprite.getWidth()/2, logoSprite.getHeight()/2); 
logoSprite.setPosition(-logoSprite.getWidth()/2, -logoSprite.getHeight()/2); 

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

我的下一个问题是sprite.setSize vs sprite.setScale。为什么两者的区别? (他们似乎做同样的事情,除了setScale叶getWidth和getHeight不变)。

由于我的游戏将大量使用2D相机进行平移,缩放和旋转,因此我在开始编写任何代码之前尽可能多地了解libgdx框架。作为一个方面说明,我有一个游戏开发和数学背景,我已经使用XNA制作了几个2D和3D游戏。我发现LibGdx有点令人沮丧,因为它没有像我期待的那样抽象掉OpenGL,到目前为止,我一直在试验的2D绘图似乎比它应该更混乱!

我也想指出,我打算为我的动画使用脊柱。这应该改变我的选择使用y-up还是y-down?

回答

7

的文档,这样做是你的创造方法

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

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

和scrh是你的视口的高度,

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

sprite.setsize用于当我们规模的大/小纹理,这样它的质量会在所有设备(hdpi.mdpi,xhdpi,LDPI)良好的使用设定精灵的大小和sprite.setscale ..

没有必要担心如果你正在使用脊椎它在libgdx中工作顺利..

+0

感谢您的回复。我期待通过将原点设置为纹理的中心来绘制图像。这就是它在XNA中的工作方式,但看起来像LibGDX总是从左下角绘制,而不管原点如何。另一件事是相机在0,0,所以屏幕的中心是0,0。示例代码不会为您添加camera.update调用,所以我没有应用对缩放位置的更改。 我在脊柱上的问题直接关系到切换摄像机到y-down。有没有像翻转区域一样翻转脊椎动画的方法? – jjhavokk

+0

是的,你可以翻转动画,在libgdx中,如果我们想要翻转一个动画,我们只是把它放在一个sprite中,然后翻转这个sprite就像这样image.flip(true,false); –

1

只需使用此代码,如果可能的话

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

要居中精灵到屏幕中间的地方“形象”为您加载/宣称最初的纹理。

至于为什么它会进入一个奇怪的位置是由于您使用的是相机。 这改变了看法。如果你想在屏幕中心画一个精灵很多刚刚经历libgdx约相机here

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()中调用此方法;