1

ボタンの背景にNinePatchを使用して、シンプルなボタンを備えたメインメニューのステージを使用してテストしています。

これを設定するコードは次のようになります。

NinePatch テキストボタンのセットアップ

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 ピクセルです。しかし、このコードを使用して、4px 分割の 24x24 テクスチャにトリミングしました (ここから取得: Libgdx Scene2d ボタンの背景として 9 パッチの画像を読み込むとひどいように見えます):

ナインパッチの作成

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 はまったく同じように描画する必要があるため、なぜこれが起こっているのかわかりません。

誰かが助けを提供できるなら、私はそれを感謝します。

前もって感謝します。

4

1 に答える 1

2

わかりました、何が起こっているのか理解できたと思います。私は愚かです。

画面の寸法が奇数の場合、画面の中心は整数ピクセル値ではなく、代わりに .5 値になります。これは、整数位置に描画されたものはすべてぼやけることを意味します。

これを修正する最も簡単な方法は、サイズ変更メソッドを変更することです。高さまたは幅が奇数の場合、以下に示すように、カメラの x または y 位置を 0 ではなく 0.5 に設定します。これで問題は解決します:)

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;
于 2013-08-12T22:44:37.160 に答える