libGDX调整Sprite大小时如何实现纹理重复平铺而非拉伸
解决方案
核心原因
你已经正确给纹理设置了Repeat环绕模式,出现拉伸是因为Sprite默认的UV坐标范围固定为0~1,无论Sprite缩放多大,都会把整张纹理拉伸覆盖整个Sprite区域,只有将UV的上限调整为大于1的数值,才会触发纹理重复逻辑。
修改步骤
你只需要在设置Sprite尺寸后,根据Sprite实际大小和原始纹理尺寸计算平铺次数,再手动修改Sprite的UV范围即可,具体修改位置如下:
1. 构造函数内添加UV配置
在你调用sprite.setSize()之后新增如下代码:
sprite = new Sprite(waterTexture); sprite.setSize((float) Gdx.graphics.getWidth(), (float) Gdx.graphics.getHeight()); // 原有设置尺寸的代码 // 新增代码开始 // 计算横向、纵向需要平铺的次数 float repeatX = sprite.getWidth() / waterTexture.getWidth(); float repeatY = sprite.getHeight() / waterTexture.getHeight(); // 调整Sprite的UV坐标范围 sprite.setU(0); sprite.setU2(repeatX); sprite.setV(0); sprite.setV2(repeatY); // 新增代码结束 compileShader();
2. 可选优化绘制调用
你现有Draw方法里的绘制代码可以简化,直接调用Sprite自带的draw方法即可,效果完全一致:
// 替换原有batch.draw(sprite, sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight()); sprite.draw(batch);
动态缩放适配
如果你后续会在运行时动态修改Sprite的尺寸,每次修改完setSize()后都要重新计算并设置一次U2和V2参数,就能保证缩放时始终保持平铺效果。
注意事项
如果测试时发现重复不生效,可以检查纹理尺寸是否为2的幂次,部分旧设备对非2幂次纹理的Repeat模式支持存在兼容性问题。
内容的提问来源于stack exchange,提问作者LancesLance
相关产品推荐
相关产品推荐

