我正在测试使用Stage进行主菜单的简单按钮,使用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像素×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应该完全相同。
如果有人能提供任何帮助,我会很感激。
提前致谢。
答案 0 :(得分:2)
好吧,我想我意识到发生了什么,我很蠢。
如果屏幕尺寸为奇数,则屏幕中心不再是整数像素值,而是0.5值。这意味着在整数位置绘制的任何内容都会模糊不清。
我能想到解决这个问题的最简单方法是改变resize方法。如果高度或宽度为奇数,请将摄像机的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;