LibGdx如何重复背景?

MBR*_*que 3 java libgdx

几天前我想出了如何在LibGdx中进行一些滚动.现在我正在试图做一些相关的事情.我想重复背景.我的滚动跟随一艘船(是一个s [王牌船游戏].在背景中有一张空间照片作为纹理加载.当船到达backgorund的末端时,它继续前进并且不再有背景.我读过关于包装的内容,但我并不真正理解它是如何工作的.我这样做了:

    px=new Pixmap(Gdx.files.internal("fondo.jpg"));
    background=new Texture(px);
    background.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
Run Code Online (Sandbox Code Playgroud)

然后,在我的渲染方法中

spriteBatch.begin();
    spriteBatch.draw(background,0,0,500,50);
    drawShip();
spriteBatch.end();
Run Code Online (Sandbox Code Playgroud)

当然它不起作用,它只绘制一次背景.我不知道如何使这个包装方法工作.有帮助吗?

我想到了.这不是一个很好的代码,但它的工作原理.

首先,我用相同的图像声明两个纹理

 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));
Run Code Online (Sandbox Code Playgroud)

我还声明了两个这样的变量来指定每个bck位置的X值

 int posXBck1=0,posXBck2=0;
Run Code Online (Sandbox Code Playgroud)

然后我在Render()中使用它

 public void calculoPosicionFondos(){
    posXBck2=posXBck1+ANCHODEFONDO;
    if(cam.position.x>=posXBck2+cam.viewportWidth/2){
        posXBck1=posXBck2;
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里:

ANCHODEFONDO是我背景的宽度

Cam是OtrhoCam.

所以我说如果凸轮在bck2中(这意味着你不能再看到bck1)它改变位置,给出bck2 de bck2的位置,并在下一个渲染循环中重新计算bck2

然后在渲染模式下绘制两个bck.

Mad*_*nyo 18

就像Teitus说的那样,不要多次加载纹理!无论如何,你在包装纸的正确轨道上:

texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
Run Code Online (Sandbox Code Playgroud)

现在您可以将draw方法与源位置一起使用.源位置是您选择在纹理上绘制的区域.

batch.draw(texture, x, y, srcX, srcY, srcWidth, srcHeight)
Run Code Online (Sandbox Code Playgroud)

要从右向左滚动纹理,您所要做的就是逐步增加srcX.因此,创建一个在update/render方法中递增的int.

int sourceX = 0;

//render() method

//Increment the variable where to draw from on the image.
sourceX += 10;

//Simply draw it using that variable in the srcX.    
batch.draw(YourTexture, 0, 0, sourceX, 0, screenWidth, screenHeight);
Run Code Online (Sandbox Code Playgroud)

因为你正在包装纹理,它将包装/循环并无限滚动.如果游戏运行了很长时间,那么sourceX int可能会出现问题,因为int只能容纳2147483647.这需要一段时间但你可以通过在每次数字超过总图像宽度时减去图像宽度来修复它.


aac*_*neo 9

请不要这样:

bck1=new Texture(Gdx.files.internal("fondo.jpg"));
bck2=new Texture(Gdx.files.internal("fondo.jpg"));
Run Code Online (Sandbox Code Playgroud)

这将加载你的大背景纹理两次.这完全是浪费.如果你想保持你的解决方案至少做:

bck1=new Texture(Gdx.files.internal("fondo.jpg"));
bck2=bkg1;
Run Code Online (Sandbox Code Playgroud)

关于纹理包装.如果您的纹理宽度为500px,并且您绘制了500px精灵,则不会看到任何重复.如果你想重复2次,用0-2纹理坐标绘制1000px宽.我不确定spriteBatch如何处理你发布的调用,你可以尝试那个,或者可以使用使用纹理区域的重载并手动设置你的区域.