LibGDX 9 исправляет изображение поверх изменяемого фона

#java #libgdx

#java #libgdx

Вопрос:

Я использую компоненты пользовательского интерфейса LibGDX для отображения пользовательского интерфейса моей игры.

Я хочу показать мраморный фон в рамке за моими меню. Для этого у меня есть изображение с девятью участками с рамкой и фоновым изображением из мрамора.

Он пытался использовать оба в моем меню, состоящем из области прокрутки, содержащей таблицу.

Итак, я определил рамку исправления 9 в качестве фона области прокрутки:

 com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: {
    default: { ..., background: frame }
}
  

И добавьте (большой) мраморный фон в мою таблицу:

 table.setBackground(skin.getTiledDrawable("big-marble-texture"));
  

Однако похоже, что рамка находится вокруг мраморного фона, а не его части:

введите описание изображения здесь

Я не могу просто сделать текстуру мрамора частью исправления 9: я хочу, чтобы она была выложена плиткой, а не масштабировалась до размера меню (я пробовал, это выглядит ужасно). Я также попытался отобразить фрейм непосредственно на сцене в верхней части меню, это работает, но тогда код действительно неудобен в использовании, особенно с динамическим интерфейсом, таким как всплывающие подсказки или движущиеся карточки.

Каков рекомендуемый способ сделать это в компонентах пользовательского интерфейса libgdx?

Ответ №1:

Я не уверен, каков рекомендуемый способ решения этой проблемы, но один из способов — создать класс, состоящий из a TiledDrawable и a NinePatch , и позволить этому классу расширяться BaseDrawable .

Таким образом, вы можете переопределить draw метод, чтобы сначала нарисовать фон как a TiledDrawable (смещение для учета вставок NinePatch ), а затем нарисовать NinePatch как границу.

Например:

 package com.bornander.sandbox;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.utils.BaseDrawable;
import com.badlogic.gdx.scenes.scene2d.utils.TiledDrawable;
import com.badlogic.gdx.scenes.scene2d.utils.TransformDrawable;

public class BorderedTiledDrawable extends BaseDrawable implements TransformDrawable {
    private TiledDrawable region;
    private NinePatch patch;
    private int left;
    private int top;
    private int right;
    private int bottom;

    public BorderedTiledDrawable(Texture background, Texture border, int left, int top, int right, int bottom) {
        region = new TiledDrawable(new TextureRegion(background));
        this.patch = new NinePatch(border, left, top, right, bottom);
        this.left = left - 1;
        this.top = top - 1;
        this.right = right - 1;
        this.bottom = bottom - 1;
        setMinWidth(patch.getTotalWidth());
        setMinHeight(patch.getTotalHeight());
        setTopHeight(patch.getPadTop());
        setRightWidth(patch.getPadRight());
        setBottomHeight(patch.getPadBottom());
        setLeftWidth(patch.getPadLeft());
    }

    @Override
    public void draw(Batch batch, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation) {
        region.draw(batch, x, y, originX, originY, width, height, scaleX, scaleY, rotation);
        patch.draw(batch, x, y, originX, originY, width, height, scaleX, scaleY, rotation);
    }

    @Override
    public void draw(Batch batch, float x, float y, float width, float height) {
        region.draw(batch, x   left, y   top, width - (left   right), height - (top   bottom));
        patch.draw(batch, x, y, width, height);
    }
}
  

Который выглядит так:

плиточный и девятый патч

Это не будет работать полностью, если ваш nine-patch имеет очень закругленные углы, но это также легко настроить.