瓷砖地图运动中的白色垂直线条和紧张的水平线条

时间:2014-12-10 01:26:10

标签: graphics libgdx sprite tiling

我无法找到答案,为什么我为瓷砖地图制作的瓷砖表会在使用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

当我将这个非常好的瓷砖放入我们的引擎时,您可以看到各个瓷砖周围的外观。即使我在当前引擎中使用与此项目完全相同的tileheet,也是如此。

我和我的伙伴都在研究导致这种情况的原因,即使我们找到了几个可能的答案,但没有任何效果。我们目前的解决方案感觉非常错误。我使用Photoshop来创建我的瓷砖表。我保持非常有条理,这样当它被导入到Tiled时,它是有效的。这是我一直在使用的测试表,用于创建上述示例的测试表:
enter image description here

作为一项实验,我的朋友创建了一些简单的32x32磁贴,并使用TexturePacker打包它们,然后在Tiled中使用它们。最终结果就是这个文件:

enter image description here

如果你在图像编辑器中打开该文件,你会发现没有意义,瓷砖甚至不均匀。蓝色和绿色瓷砖是34x34,而红色和黄色是35x34。他说在TexturePacker中他已经将填充和间距都定义为2.所以首先我很困惑32x32磁贴如何以各种大小输出。然后他说他将其导入Tiled并将导入设置设置为33x33,间距和填充均为1.使用这些图块创建的地图似乎在我们的引擎中有效。这引发了一些问题。

首先,我不想使用TexturePacker,因为我不是一次创建一个图块,我有一个有组织的布局创建的主图块表。当导入到平铺时,TexturePacker的输出是不可行的混乱。我觉得我应该能够手工创建有组织的瓷砖表而不必依赖TexturePacker。此外,使用TexturePacker意味着我必须导出我的主表,然后手动将其刻录成单个图像,涉及的工作量会以指数方式增加工作量,因此避免这种情况是最好的。

我还发现输出,将32x32磁贴转换为34x34和35x34磁贴会扭曲我的图形。这不是正确的方法。如何创建在平铺地图中使用并在GDX中使用的平铺图表,其显示方式与我在上面第二个视频链接中演示的图块一样流畅?

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

1 个答案:

答案 0 :(得分:12)

我有同样的问题,当我移动时,我的瓷砖之间出现垂直线条。为了解决这个问题,我过去常常使用以下代码:

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()方法运行它们就可以解决问题。