我正在测试使用主菜单的舞台和简单的按钮,并使用NinePatch作为按钮背景。

设置代码如下:

NinePatch TextButton设置

NinePatch btnNormal9 = NinePatchHelper.processNinePatchFile("data/button_normal.9.png");

NinePatchDrawable btnNormal9Drawable = new NinePatchDrawable(btnNormal9);

TextButtonStyle style = new TextButtonStyle(btnNormal9Drawable, btnNormal9Drawable, btnNormal9Drawable);
style.font = new BitmapFont();
style.fontColor = new Color(1, 1, 1, 1);

button = new TextButton("Start Game", style);
button.setSize(200, 100);
button.setPosition(0, 0);

stage.addActor(button);



然后在我的调整大小函数中,我现在只是这样做:

调整代码

@Override
public void resize(int width, int height) {
    camera.viewportWidth = width;
    camera.viewportHeight = height;
    camera.update();
}



无论窗口的大小(是摄影机视口的大小)如何,按钮都应位于屏幕上的(0,0)处,并为200 x 100像素。

NinePatch图像(“ data / button_normal.9.png”)为26x26像素。但是使用此代码(从此处获取:Loading nine-patch image as a Libgdx Scene2d Button background looks awful)裁剪为4px的24x24纹理:

创建NinePatch

public static NinePatch processNinePatchFile(String filename) {
    final Texture t = new Texture(Gdx.files.internal(filename));
    final int width = t.getWidth() - 2;
    final int height = t.getHeight() - 2;
    return new NinePatch(new TextureRegion(t, 1, 1, width, height), 4, 4, 4, 4);
}



只要窗口尺寸是偶数,例如640x400像素,如以下屏幕截图所示:



但是,如果窗口尺寸是奇数,例如639x401像素,则NinePatch无法正确缩放:



如果仅高度为奇数,则渲染错误仅在NinePatch的垂直缩放中发生,如下所示:



我不明白为什么会这样,因为按钮的大小和位置在每种情况下都被硬编码为相同,因此NinePatch的绘制应该完全相同。

如果有人可以提供任何帮助,我将不胜感激。

提前致谢。

最佳答案

好吧,我想我知道发生了什么,我很愚蠢。

如果屏幕尺寸奇数,则屏幕中心不再是整数像素值,而是.5值。这意味着在整数位置绘制的任何内容都会模糊。

我想解决此问题的最简单方法是更改​​大小调整方法。如果高度或宽度为奇数,请将相机的x或y位置设置为0.5而不是0,如下所示。这解决了问题:)

if (width % 2 != 0) guiCamera.position.x = 0.5f;
else guiCamera.position.x = 0f;

if (height % 2 != 0) guiCamera.position.y = 0.5f;
else guiCamera.position.y = 0f;

10-04 20:41