我使用扩展视口为游戏制作了界面,当我调整屏幕大小时,宽高比会发生变化,场景中的每个元素都会缩放,但是当发生这种情况时,这就是我得到的:
这是我处理过的最烦人的问题,有什么建议吗?我尝试将塔增大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
答案 0 :(得分:1)
在第三张图片中,您绘制的源图像略大于屏幕像素中的实际尺寸。因此,存在一些边界,其中必须填充额外的像素以使其填充其完整的屏幕尺寸。以下是解决此问题的一些方法。
编辑:
我在我的代码中查找了选项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.我将worldWidth
和worldHeight
四舍五入到最近的偶数,并将该大小用于我的FrameBuffer。然后我将FrameBuffer绘制到适当大小的屏幕上,以从舍入中裁掉任何额外的内容。这消除了常见因素变化的可能性。但是,相当复杂一点。也许有一天我会清理那些代码并发布它。