Libgdx 接口得到额外的像素

Libgdx 接口得到额外的像素,libgdx,Libgdx,我使用扩展视口为游戏制作了一个界面,当我调整屏幕大小时,纵横比会发生变化,场景中的每个元素都会缩放,但当发生这种情况时,我得到的是: 这是我处理过的最烦人的问题,有什么建议吗?我试着把塔楼放大n倍,然后只为视口设置更大的世界大小,但同样的事情发生了,idk图像上的额外像素是什么 我正在从atlas加载图像 new TextureRegion(skin.getAtlas().findRegion("tower0")); 地图集如下所示: skin.png size: 1024,1024 for

我使用扩展视口为游戏制作了一个界面,当我调整屏幕大小时,纵横比会发生变化,场景中的每个元素都会缩放,但当发生这种情况时,我得到的是:

这是我处理过的最烦人的问题,有什么建议吗?我试着把塔楼放大n倍,然后只为视口设置更大的世界大小,但同样的事情发生了,idk图像上的额外像素是什么

我正在从atlas加载图像

new TextureRegion(skin.getAtlas().findRegion("tower0"));
地图集如下所示:

skin.png
size: 1024,1024
format: RGBA8888
filter: Nearest,Nearest
repeat: none
tower0
  rotate: false
  xy: 657, 855
  size: 43, 45
  orig: 43, 45
  offset: 0, 0
  index: -1

在第三张图片中,您绘制的源图像略大于屏幕像素的实际大小。因此,有一些边界需要填充额外的像素,以使其填充整个屏幕大小。这里有一些方法可以解决这个问题

  • 使用线性滤波。为获得最佳外观,请将MipMapLinearLinear用于最小过滤器。这是一个快速而肮脏的解决办法。结果可能看起来有点模糊
  • 将游戏绘制到帧缓冲区,该帧缓冲区的大小与屏幕的纵横比相同,但缩小到可以将精灵绘制为与原始比例完全相同的像素大小。然后使用上采样着色器将该帧缓冲区绘制到屏幕。通过搜索像素高比例着色器,可以找到一些不错的着色器
  • 最好的选择是编写一个自定义视口类,该类调整世界宽度和高度,以便始终以完美像素或整数倍数绘制精灵。这里的缺点是,您的世界大小在不同设备之间不一致。有些设备会一次看到更多的场景。我曾在一个游戏中使用过这种方法,玩家总是朝着同一个方向移动,因此我将相机放置在角色面前,以显示相同的空间大小,而不考虑世界大小,这样可以保持公平 编辑:

    我在选项3中查找代码。作为一种快捷方式,我没有编写自定义视口类,而是使用了StretchViewport,并在游戏的
    resize()
    方法中更新它之前简单地更改了它的世界宽度和高度。像这样:

    int pixelScale = Math.min(
                height / MIN_WORLD_HEIGHT,
                width / MIN_WORLD_WIDTH);
    int worldWidth = width / pixelScale;
    int worldHeight = height / pixelScale;
    stretchViewport.setWorldWidth(worldWidth);
    stretchViewport.setWorldHeight(worldHeight);
    stretchViewport.update(width, height, true);
    
    现在,如果你的像素比例在屏幕的宽度和高度上都不可完全分割,那么你可能仍然会有舍入瑕疵。您可能需要在计算中做更多的工作,比如将
    pixelScale
    舍入到屏幕宽度和高度之间最接近的公共整数因子。棘手的部分是选择一个不会导致不同手机尺寸之间的“缩放”量发生巨大变化的值,但您可以通过调整桌面窗口的大小来快速测试这一点


    在我的例子中,我合并了选项2和选项3。我将
    worldWidth
    worldWidth
    四舍五入到最接近的偶数,并将该大小用作帧缓冲区。然后,我将帧缓冲区以正确的大小绘制到屏幕上,以便从舍入中裁剪出任何额外的内容。这消除了共同因素变化的可能性。不过要复杂一点。也许有一天我会清理代码并发布它。

    你能展示一下你是如何加载图像的吗?我只是从atlas
    新的纹理区域(skin.getAtlas().findRegion(“tower0”))加载纹理。
    然后绘制它,你能展示atlas吗?特别是过滤器。@icarumbas我编辑的第一篇文章添加了atlas partI当时不知道。我对线性过滤器也有同样的问题,通过更改为“最近”来解决。尝试更改过滤器没有发现区别,我正在考虑编写视口,但idk从何处开始,您编写了吗?如果你这样做了,也许你会分享它的来源