我很难找到答案,为什么我在使用libGDX在屏幕上四处移动时为我的图块制作的图块会创建垂直的白线和抖动的水平线。

这是显示白色竖线的视频:https://www.youtube.com/watch?v=34V64WacMo4
这是显示水平抖动线的一条:https://www.youtube.com/watch?v=LiozBZzxmy0

为了进行比较,这是我今年年初在没有GDX的情况下进行的一个项目。您可以看到tilemap平滑移动并且没有任何明显的外观:https://www.youtube.com/watch?v=VvdPdA_253k

当我将这个磁贴集放入引擎中时,您会看到各个磁贴周围的阴影。即使我在当前引擎中使用与该项目完全相同的图块,也是如此。

我和我的伴侣都一直在调查导致这种情况的原因,即使我们找到了几种可能的答案,也没有任何效果。我们目前的解决方案感到非常错误。我使用Photoshop创建拼贴图。我将其组织得井井有条,以便将其导入Tiled后可以高效使用。这是我一直在使用的测试表,用于创建上述示例的测试表:


作为实验,我的朋友创建了一些简单的32x32瓦片,并使用TexturePacker对其进行打包,然后在Tiled中使用了它们。最终结果是该文件:



如果在图像编辑器中打开该文件,您会发现它毫无意义,这些图块甚至都不统一。蓝色和绿色的瓷砖为34x34,红色和黄色的瓷砖为35x34。他说,他在TexturePacker中将填充和间距都定义为2。所以首先,我对32x32瓦片如何获得各种尺寸的输出感到困惑。然后,他说他将其导入Tiled,并将导入设置设置为33x33,间距和填充均为1。使用这些tile创建的地图似乎可以在我们的引擎中使用。这带来了几个问题。

首先,我不想使用TexturePacker,因为我不会一次在瓷砖上创建图形,而是在组织化的布局中创建了一个主瓷砖工作表。当导入Tiled时,TexturePacker的输出是一个不可行的杂物。我觉得我应该能够手工创建有组织的磁贴,而不必依赖TexturePacker。另外,使用TexturePacker意味着我将不得不导出我的母版纸,然后手动将其雕刻成单个图像,涉及的工作量成倍增加,因此最好避免这种情况。

我还发现,将32x32瓦片变成34x34和35x34瓦片的输出会使我的图形失真。这不是正确的方法。如何创建在图块地图中使用和在GDX中使用时,显示效果与我在上面的第二个视频链接中显示的效果一样平滑的图块?

如果有兴趣,这是我们应用程序的当前工作分支:https://github.com/vinbreauX/DULES

最佳答案

我遇到了完全相同的问题,移动时瓷砖之间出现了垂直线。为了解决这个问题,我习惯于以下代码:

public static void fixBleeding(TextureRegion[][] region) {
    for (TextureRegion[] array : region) {
        for (TextureRegion texture : array) {
            fixBleeding(texture);
        }
    }
}

public static void fixBleeding(TextureRegion region) {
    float fix = 0.01f;

    float x = region.getRegionX();
    float y = region.getRegionY();
    float width = region.getRegionWidth();
    float height = region.getRegionHeight();
    float invTexWidth = 1f / region.getTexture().getWidth();
    float invTexHeight = 1f / region.getTexture().getHeight();
    region.setRegion((x + fix) * invTexWidth, (y + fix) * invTexHeight, (x + width - fix) * invTexWidth, (y + height - fix) * invTexHeight); // Trims
                                                                                                                                                // region
}


这些方法(一种用于一系列纹理,另一种仅用于单个纹理)会稍微调整图像,以免发生渗色。调整幅度很小(0.01f),几乎看不到,但是在消除垂直线方面做得很好。加载纹理时,只需通过fixBleeding()方法运行它们,即可解决问题。

10-08 17:03