You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:54:01