在滚动游戏中重复纹理

屏幕的底部区域由重复的纹理填充:

在这里输入图像描述

grassTexture = new Texture(Gdx.files.internal("images/grass.png")); grassTexture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat); grassSprite = new Sprite(grassTexture, 0, 0, width,grassTexture.getHeight()); 

但是,草也应该滚动到左侧(从边到边循环纹理)。 我已经得到了这个render()方法:

 scrollTimer += 0.0007f; if (scrollTimer > 1.0f) scrollTimer = 0.0f; grassSprite.setU(scrollTimer); grassSprite.setU2(scrollTimer+1); grassSprite.draw(spriteBatch); 

滚动部分现在工作。 但是,草地纹理不再重复。 它看起来像这样:

破碎的重复的草纹理

我不知道libgdx足够了,但是我可以用一般的方法来暗示我,

  • 使用带宽screenWidth + textureWidth的四边形绘制纹理(而不是tileableWidth ,如果纹理本身已经重复了tile, textureWidth可以使用tileableWidth )。
  • x = (x + dx) % textureWidth (也可以是tileableWidth可以是tileableWidth ; dx是每个迭代的变化,根据您的实现可以是固定的或基于时间的)。

这将导致你的纹理无限循环,而不需要着色器,改变纹理坐标等,而不会浪费不必要的绘图时间(当试图在屏幕之外绘制部分时,只有最小的开销)。


编辑:与附加的图片,我想这个问题是这一行:

 grassSprite.setU2(scrollTimer+1); 

通过将右边框设置为scrollTimer+1您基本上可以告诉引擎重复一次纹理。 这是错误的,这里的罪魁祸首。 解决scheme取决于您需要填充可用空间的重复次数。 例如,下面一行应该做的诀窍,如果你不得不重复纹理5次填补给定的空间:

 grassSprite.setU2(scrollTimer+5); 

编辑2:只是注意到你的代码中可能会使纹理“跳跃”的另一个错误:

 if (scrollTimer > 1.0f) scrollTimer = 0.0f; 

这部分应该是这样的:

 if (scrollTimer > 1.0f) scrollTimer -= 1.0f;