界面获得额外的像素

时间:2017-10-30 17:51:46

标签: libgdx

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

enter image description here

这是我处理过的最烦人的问题,有什么建议吗?我尝试将塔增大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

1 个答案:

答案 0 :(得分:1)

在第三张图片中,您绘制的源图像略大于屏幕像素中的实际尺寸。因此,存在一些边界,其中必须填充额外的像素以使其填充其完整的屏幕尺寸。以下是解决此问题的一些方法。

  1. 使用线性过滤。为获得最佳外观,请使用MipMapLinearLinear作为最小过滤器。这是一个快速而肮脏的修复。结果可能看起来有点模糊。
  2. 将您的游戏绘制到一个FrameBuffer,其尺寸与您的屏幕尺寸相同,但缩小到一个尺寸,您的精灵将按照原始比例完美地绘制像素。然后使用上采样着色器将FrameBuffer绘制到屏幕上。通过搜索像素高档着色器,您可以找到一些好的。
  3. 最好看的选项是编写一个自定义的视口类,它可以调整世界的宽度和高度,这样您就可以完美地绘制精灵像素或者整数倍。这里的缺点是您的世界大小将在各设备之间不一致。有些设备会立刻看到更多的场景。我已经在游戏中使用这种方法,玩家总是朝同一方向行进,所以我将相机定位在角色前面显示相同数量的空间而不管世界大小,这样可以保持公平。
  4. 编辑:

    我在我的代码中查找了选项3.作为一种快捷方式,我使用的是StretchViewport,而不是编写自定义的Viewport类,只是在游戏更新之前简单地改变了它的世界宽度和高度。 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四舍五入到屏幕宽度和高度之间最接近的公共整数因子。棘手的部分是选择一个不会导致" zoom"在不同的手机尺寸之间,您可以通过尝试调整桌面窗口的大小来快速测试。

    就我而言,我合并了选项2和3.我将worldWidthworldHeight四舍五入到最近的偶数,并将该大小用于我的FrameBuffer。然后我将FrameBuffer绘制到适当大小的屏幕上,以从舍入中裁掉任何额外的内容。这消除了常见因素变化的可能性。但是,相当复杂一点。也许有一天我会清理那些代码并发布它。