LibGDX - 对话标题不适合

时间:2014-06-19 20:35:20

标签: java fonts dialog libgdx

我成功地将自己的字体添加到默认的.json文件中并显示,但是我得到了一些奇怪的大小调整问题。特别是当我尝试创建一个Dialog时。这就是它的样子:Sizes 忽略这样的事实"和"
如你所见,标题不是合适,按钮看起来有点大......这就是我创建对话框的方式:

Dialog d = new Dialog("Error", RBResources.gameSkin);
        d.add(new Label("You cannot continue and empty game.", RBResources.gameSkin));
        TextButton b = new TextButton("Ok", RBResources.gameSkin);
        d.button(b);
        d.show(this);

这是皮肤初始化的方式:

gameSkin = new Skin(Gdx.files.internal("skins/uiskin.json"));

我添加字体的所有内容都是使用Hiero创建字体,使用.json将其添加到目录中,并从" default.fnt"更改BitmapFont文件引用。 to" text.fnt" (文字就是我所说的字体)。

2 个答案:

答案 0 :(得分:4)

所以我一直在想的是:对话框是用单个NinePatch构建的,所以你需要在.atlas文件和.png文件中手动调整标题栏的大小。

<强> 修改
这基本上是一个如何使用带有LibGdx的JSON文件教程。

LibGdx有一个非常有用的类叫Skin。它允许您将.json文件与.atlas文件和.png图像一起使用,以便非常轻松地定义用于制作ButtonTextButton s,Dialog等的样式。

LibgGdx默认皮肤

  1. JSON File
  2. ATLAS File
  3. ATLAS Image Pack
  4. Font File
  5. Font Image
  6. JSON文件的工作原理
    JSON文件包含不同类类型及其参数的列表。在这个问题的情况下,我们将看看Dialog风格。因为对话框是Window的子类,所以它使用WindowStyle(并非所有其他类的子类都这样做),因此我们必须查看WindowStyle的JSON文件。

    com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: {
    default: { titleFont: default-font, background: default-window, titleFontColor: white },
    dialog: { titleFont: default-font, background: default-window, titleFontColor: white, stageBackground: dialogDim }
    },
    

    如您所见,对话框是用于Dialog的样式类型,而默认用于常规Window。大多数属性都是不言自明的,但您需要知道的是,字体总是在JSON文件中声明,位于顶部。您可以添加任意多个,只需确保在与JSON文件相同的文件夹中包含该字体的.fnt文件和.png图像,并正确引用它们。你可以使用像Hiero这样的BitmapFont生成器轻松制作字体,可以在这里找到:https://github.com/libgdx/libgdx/wiki/Hiero。颜色也在JSON文件的顶部创建,位于字体下方。您可以根据需要创建任意数量的内容。 stageBackground是在显示对话框时将覆盖舞台其余部分的颜色。在这种情况下,它是dialogDim,在JSON文件中定义为TintedDrawable。最后一个属性是对ATLAS Image Pack中图像的引用。

    ATLAS文件如何工作
    ATLAS文件基本上是对ATLAS图像包中TextureRegion的引用的集合。其中许多是不言自明的,其余的可以通过一些试验和错误来理解,但是现在我们将专注于对话框片段的引用。 default-window在ATLAS文件中引用此位:

    default-window
      rotate: false
      xy: 1, 20
      size: 27, 29
      split: 4, 3, 20, 3
      orig: 27, 29
      offset: 0, 0
      index: -1
    

    这些字段可能有点令人困惑,我也不理解它们,但您需要知道的是rotate应始终保持为假,除非您知道它何时不应该。 xy是ATLAS图像包中TextureRegion的x和y位置,(以像素为单位)size是x大小和y大小,以像素为单位splitTextureRegion应该如何拆分(不适用于所有ATLAS参考),您可以在此处找到有关这些数字如何工作的更多信息:https://github.com/libgdx/libgdx/wiki/Ninepatches。据我所知,orig始终与size相同。除非您有理由让该区域在开始时偏离offset位置,否则xy应始终保持为0,0。 index为-1意味着该区域与其他区域位于同一ATLAS图像包内。

    如何使用
    现在您可以轻松进行自己的修改。只需找到您想要添加自己的样式,复制要更改的样式(或直接更改默认值),为其添加自己的名称,并添加自己的ATLAS引用。在ATLAS文件和图像包中,您还可以添加自己的区域。您还可以为样式之外的其他类添加自己的属性,因为Skin类似乎是JSON阅读器上的一个轻量级包装器,可以轻松读取样式。
    我希望这一切都是可以理解的:)

答案 1 :(得分:0)

正如StrongJoshua在他的answer中所说,对话框的背景是NinePatch,因此标题栏的大小由NinePatch所基于的PNG定义。

如果你不喜欢使用像素编辑器搞乱这一切,那么快速而肮脏的解决方案就是改变NinePatch渲染的比例。这将使它更像“像素”&#39;但也会增加标题栏的大小。

您可以访问NinePatch对象并从对话框中调用scale(),如下所示:

NinePatchDrawable dialogBack = (NinePatchDrawable)dialog.getBackground();
dialogBack.getPatch().scale(2.0f,2.0f);

编辑: 但问题是,每次调用scale()都是相加的,因此每次执行此操作时,它的大小都会增加一倍。如果你总是想要相同的尺寸,最好在你加载皮肤后立即设置一次,如下所示:

NinePatch dialogBack = skin.getPatch("default-window");
dialogBack.scale(2.0f,2.0f);