所以即时使用libgdx,制作平台游戏。我使用方形瓷砖作为平台,但是当它们被绘制时,它们中的一些在它们之间有间隙。当我放大/缩小或移动相机移动间隙移动位置。有没有人有同样的问题或知道如何解决它?
更多细节。瓷砖的尺寸为32,并且已经尝试了32和64的纹理。瓷砖排列成32个例如。第一个瓦片将是x = 0 y = 0秒x = 32 y = 0,并且在x和y方向上都是如此。差距不是纹理假象,因为我已经检查了很多次。使用带填充的纹理包。我最好的猜测是,将纹理转换为屏幕坐标是一个问题,但实际上根本不知道如何解决这个问题。我以为这个问题以前出现过,但在任何地方找不到任何修复。我已经检查并用瓷砖尺寸仔细检查了我的精度并将它们排成一行。
非常感谢任何帮助。 感谢。
答案 0 :(得分:10)
这是另一个迟到的帖子,但我刚开始使用LibGDX,我遇到了同样的问题。我通过将TexturePacker.Settings类的duplicatePadding字段设置为true来修复它。
示例代码:
import com.badlogic.gdx.tools.texturepacker.TexturePacker;
import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings;
Settings settings = new Settings();
settings.maxWidth = 1024;
settings.maxHeight = 1024;
settings.duplicatePadding = true;
TexturePacker.process(settings, "source",
"destination", "name");
答案 1 :(得分:6)
好吧,我来这里救你的一天!
该解决方案称为“边缘填充”。现在,如果您正在使用tilesets,我可以向您保证这将有效。
就我个人而言,我正在使用Tiled,它允许我调整我的tilesets中的边距和间距。唯一的缺点是你必须使用GIMP这个插件:http://registry.gimp.org/node/26044
这个插件可以让你将边缘填充应用到你的瓷砖组中!没有更丑陋的文物。
答案 2 :(得分:4)
答案 3 :(得分:3)
它被称为“纹理出血”。您需要为贴图添加填充,以便在纹理渗出时,它可以收集正确的像素数据以填补空白。
答案 4 :(得分:2)
我知道在这篇文章中回答有点迟,但当我找到解决方案时,我来到这里。
然而,对我来说,我找到了一种更简单的方法来消除瓷砖之间随机出现的闪烁或间隙。
我只是为玩家的位置添加了一个非常长的小数位数:
camera.position.set((int)robot.position.x, (int)robot.position.y, 0);
这让玩家非常奇怪地移动并让他再次顺利移动我在其渲染方法中添加了一个演员:
batcher.draw(robotSprite, (int)robot.position.x, (int)robot.position.y, 16, 16);
Etvoilà!为我完美工作。
答案 5 :(得分:0)
我会在这里发布我的解决方案以及我为Libgdx尝试过的关于这个问题的内容。
-
T1。将从某处下载的原始spritesheet(无atlas文件)制作为padding 2.
A1。这对于重新打包没有地图集的spritesheet是不可能的,即使你找到了切片/分割器工具,也应该是一堆需要重新打包的图像适用于TiledMap(.tmx)
A1(更新)。 @Nine Magics提供的脚本将是最好的方法! (我用这个作为我的最终解决方案)
-
T2。使用 libgdx-nighty 或 gdx-toolg 提供的TiledMapPacker
,批处理代码应为:< / p>
java -classpath "gdx.jar";"gdx-natives.jar";"gdx-backend-lwjgl.jar";"gdx-backend-lwjgl-natives.jar";"gdx-tiled-preprocessor.jar";"extensions/gdx-tools/gdx-tools.jar" com.badlogic.gdx.tiledmappacker.TiledMapPacker "PathToYourProject\android\assets\RawMap" "PathToYourProject\android\assets\Map" --strip-unused
A2。 Tiled无法读取的输出.tmx如果您使用复杂的文件夹路径来对.png
文件进行分类。输出文件可能无法通过AtlasTmxMapLoader
加载。
-
T3。相机位置校正,使相机位置为整数。代码喜欢@ {Jilian或libgdx tiledmap flicker with Nearest filtering
中的@strangecatA3。我使用此解决方案没有问题,并且发布了与我们不同的代码。
float cameraX = (int)(mainCamera.position.x * Game.PPM_X) / Game.PPM_X;
float cameraY = (int)(mainCamera.position.y * Game.PPM_X) / Game.PPM_X;
float cameraZ = mainCamera.position.z;
mainCamera.position.set(cameraX, cameraY, cameraZ);
并使用TmxMapLoader.Parameters
TmxMapLoader.Parameters params = new TmxMapLoader.Parameters();
params.textureMinFilter = Texture.TextureFilter.Linear;
params.textureMagFilter = Texture.TextureFilter.Nearest;
params.generateMipMaps = true;
assetManager.load(TILED_MAP_SETS.FIRST_MAP, TiledMap.class, params);
如果您使用 PPM 并希望逐个像素地移动,则可以对游戏使用此整数校正,如果不是,您可以将位置转换为整数。
我几乎浪费了一整天来解决这个问题,希望这些调查可以帮助每个游戏开发者:)
修改(2018年4月21日)强> 我发现Unity也有相同的problem,但我还没有测试过,如果Libgdx默认设置为 2x Anti-Alias 设置。 Libgdx可以通过关闭Anti-Alias将问题解决为Unity。