LibGdx如何重复背景?

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

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

然后,在我的渲染方法中

 spriteBatch.begin(); spriteBatch.draw(background,0,0,500,50); drawShip(); spriteBatch.end(); 

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

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

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

  bck1=new Texture(Gdx.files.internal("fondo.jpg")); bck2=new Texture(Gdx.files.internal("fondo.jpg")); 

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

  int posXBck1=0,posXBck2=0; 

然后我在Render()中使用它

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

哪里:

ANCHODEFONDO是我背景的宽度

Cam是OtrhoCam。

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

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

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

 texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat); 

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

 batch.draw(texture, x, y, srcX, srcY, srcWidth, srcHeight) 

要从右向左滚动纹理,您所要做的就是逐步增加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); 

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

请不要这样,请:

 bck1=new Texture(Gdx.files.internal("fondo.jpg")); bck2=new Texture(Gdx.files.internal("fondo.jpg")); 

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

 bck1=new Texture(Gdx.files.internal("fondo.jpg")); bck2=bkg1; 

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

我认为这是一个非常古老的问题,但我认为有一种更简单的方法来完成背景滚动。 只需使用Sprite类。 这是我用于从右到左滚动的分层背景图像的片段。

 public class LevelLayer { public float speedScalar = 1; private List backgroundSprites = new ArrayList(); public LevelLayer() { } public void addSpriteLayer(Texture texture, float startingPointX, float y, int repeats) { for (int k = 0; k < repeats; k++) { Sprite s = new Sprite(texture); s.setX(startingPointX + (k*texture.getWidth())); s.setY(y); backgroundSprites.add(s); } } public void render(SpriteBatch spriteBatch, float speed) { for (Sprite s : backgroundSprites) { float delta = s.getX() - (speed * speedScalar); s.setX(delta); s.draw(spriteBatch); } } } 

然后你可以使用相同的纹理或一系列纹理,如下所示:

 someLayer.addSpriteLayer(sideWalkTexture1, 0, 0, 15); someLayer.addSpriteLayer(sideWalkTexture2, 15 * sideWalkTexture1.getWidth(), 0, 7); 

我在代码中随机更改背景重复部分并创建新部分或在屏幕关闭时重置现有集合。 所有图层都会进入游泳池,并在需要新图层时随机抽取。

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

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

  bck1=new Texture(Gdx.files.internal("fondo.jpg")); bck2=new Texture(Gdx.files.internal("fondo.jpg")); 

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

  int posXBck1=0,posXBck2=0; 

然后我在Render()中使用它

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

哪里:

ANCHODEFONDO是我背景的宽度

Cam是OtrhoCam。

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

然后在你的渲染中绘制两个bck()