12

我正在制作一个 2D 横向滚动太空射击类游戏,我需要一个可以无限滚动的背景(它被平铺或重复包裹)。我还想实现视差滚动,所以也许有一个最低的背景星云纹理几乎不移动,一个较高的背景包含几乎不移动的遥远恒星,而最高的背景包含移动很多的近距离恒星。

我从谷歌看到我会让每一层移动比它上面的层少 50%,但是我如何在 libgdx 中实现它呢?我有一个可以放大和缩小的相机,在物理 800x480 屏幕上可以显示从 128x128 像素(一艘船)到巨大空间区域的任何内容,其中纹理在其边缘多次包裹。

我如何连续包裹一个较小的纹理(比如 512x512),就好像它是无限平铺的(当相机缩小时),然后我如何分层多个这样的纹理,将它们放在一个合适的结构中(是否存在libgdx api中的一个?)并随着玩家坐标的变化移动它们?我已经查看了 javadocs 和示例,但找不到任何类似的问题,如果很明显,请道歉!

4

4 回答 4

11

嘿,我也在制作视差背景并试图让它滚动。

存储库中有一个 ParallaxTest.java,可以在这里找到。

这个文件是一个独立的类,所以你需要将它合并到你的游戏中。并且您将需要更改控制输入,因为它已连接到使用触摸屏/鼠标。

这对我有用。至于重复的bg,我还没有走那么远,但我认为你只需要基本的逻辑就可以了,离最后一个屏幕,改变前几个屏幕的位置到最后对齐。

于 2011-09-24T14:11:04.467 回答
3

关于视差滚动,我没有什么比 PFG 已经做过的更多的要说的了。在测试文件夹下的存储库中确实有一个示例,并在网络上提供了一些解释。我喜欢这个。有背景的事情真的很容易解决。这个和其他相关问题可以通过使用模代数来解决。我不会详细介绍,因为一旦显示就很容易理解。

想象一下,您想在屏幕上显示一个指南针。你有一个代表基点的纹理 1024x16。基本上你所拥有的只是一条带子。抛开关于真实方向等的考虑,你必须渲染它。

例如,您的视口为 300x400,并且您希望屏幕上有 200 像素的纹理(使其更有趣)。您可以使用单个区域完美地渲染它,直到到达位置 (1024-200) = 824。一旦您处于该位置,显然就没有更多的纹理了。但既然是指南针,很明显,一旦走到尽头,就必须重新开始。所以这就是答案。另一个纹理区域可以解决问题。范围 825-1023 必须由另一个区域表示。对于每个值 pos>824 && pos<1024,第二个区域的大小将为 (1024-pos)

此代码旨在用作指南针的真实示例。由于范围(0-3.6)到(0-1024)之间的转换,它一直在使用相对位置,因此非常脏。

spriteBatch.begin();
    if (compassorientation<0)
        compassorientation = (float) (3.6 - compassorientation%3.6);
    else
        compassorientation = (float) (compassorientation %  3.6);
    if ( compassorientation < ((float)(1024-200)/1024*3.6)){
        compass1.setRegion((int)(compassorientation/3.6*1024), 0, 200, 16);
        spriteBatch.draw(compass1, 0, (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), Gdx.graphics.getWidth(), 32 * (float)1.2);

    }
    else if (compassorientation > ((float)(1024-200)/1024*3.6)) {
        compass1.setRegion((int)(compassorientation/3.6*1024), 0, 1024 - (int)(compassorientation/3.6*1024), 16);
        spriteBatch.draw(compass1, 0, (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), compass1.getRegionWidth()/200f * Gdx.graphics.getWidth() , 32 * (float)1.2);
        compass2.setRegion(0, 0, 200 - compass1.getRegionWidth(), 16);
        spriteBatch.draw(compass2, compass1.getRegionWidth()/200f * Gdx.graphics.getWidth() , (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), Gdx.graphics.getWidth() - (compass1.getRegionWidth()/200f * Gdx.graphics.getWidth())  , 32 * (float)1.2);
    } 


    spriteBatch.end();
于 2012-01-24T18:16:43.463 回答
1

您可以使用 setWrap 函数,如下所示:

Texture texture = new Texture(Gdx.files.internal("images/background.png"));
texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);

它会反复绘制背景!希望这有帮助!

于 2012-11-02T05:41:51.240 回答
1

在您为对象初始化纹理的位置下方。然后在这个类型的下面

YourTexture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);

YourTexture 是您想要视差滚动的纹理。

在此代码中的您的渲染文件类型中。

batch.draw(YourTexture,0, 0, 0 , srcy, Gdx.graphics.getWidth(),     
           Gdx.graphics.getHeight());  
srcy +=10;

它会给你一个错误,所以创建一个名为 srcy 的变量。这没什么太花哨的。

Int srcy
于 2014-06-27T01:47:20.193 回答