13

我正在使用 LibGDX 制作平台游戏。我在平台上使用方形瓷砖,但是当它们被绘制时,其中一些在它们之间有间隙。当我放大/缩小或围绕间隙移动位置移动相机时。

更多细节:

  • 瓷砖是 32x32,我尝试了 32x32 和 64x64。
  • 瓦片以 32 像素间隔排列​​(例如,第一个瓦片将是 x=0 y=0,第二个 x=32 y=0,以此类推在 x 和 y 方向上)。
  • 间隙不是纹理伪影,因为我已经检查过了。
  • 我使用TexturePacker带有填充的。

我最好的猜测是将纹理转换为屏幕坐标时出现问题,但不知道如何解决这个问题,我找不到任何解决方案。我用瓷砖尺寸检查并仔细检查了我的精度并将它们排列起来。

有没有人遇到过同样的问题或知道如何解决?

4

6 回答 6

12

我通过将类的duplicatePadding字段设置为.TexturePacker.Settingstrue

示例代码:

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");
于 2015-03-04T22:22:19.680 回答
6

好吧,我是来拯救你的!

该解决方案称为“边缘填充”。现在,如果您正在使用图块集,我可以向您保证这将起作用。

就我个人而言,我正在使用 Tiled,它允许我调整我的图块集中的边距和间距。唯一的缺点是您必须将 GIMP 与此插件一起使用:http ://registry.gimp.org/node/26044

这个插件可以让你将边缘填充应用于你的图块集,瞧!不再有丑陋的文物。

于 2014-01-22T09:44:58.397 回答
4

流血的

差距

简短的回答是它可能是您的过滤器,可能需要设置为 NEAREST。

可能还想查看Libgdx 的工作教程。

于 2013-09-05T22:37:17.513 回答
3

这被称为“纹理出血”。您需要为您的图块添加填充,以便当纹理流血时,它可以收集正确的像素数据来填补空白。

于 2014-12-05T13:15:55.677 回答
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);

瞧!完美地为我工作。

于 2014-12-16T21:57:44.480 回答
0

我会在这里发布我的解决方案以及我为 Libgdx 尝试过的关于这个问题的方法。

--

T1。制作从某处下载到填充 2 的原始精灵表(无图集文件)。

A1。这对于重新打包没有图集的 spritesheet 是不可能的,即使您找到了切片/拆分工具,它也应该是一堆需要为 TiledMap(.tmx) 正确重新打包的图像

A1(更新)。@Nine Magics 提供的脚本将是最好的方法!(我用这个作为我的最终解决方案)

--

T2。使用libgdx-nightygdx-toolgTiledMapPacker提供的,批处理代码应该是:

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。相机位置校正,使相机位置为整数。代码喜欢来自libgdx tiledmap 的 @Julian 或 @strangecat 闪烁与最近过滤

A3。我毫无问题地使用此解决方案,并且还发布了与它们不同的代码。

    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/04/21) 我发现 Unity 也有同样的问题,但我没有测试如果 Libgdx 默认有2x Anti-Alias设置。Libgdx 可能会通过关闭 Anti-Alias 来解决 Unity 问题。

于 2017-09-24T17:24:20.683 回答