LibGDX ImageTextButton 当使用单独的图像文件时,所有按钮都会显示相同的图像

问题描述 投票:0回答:3

我正在为使用 LibGDX 为 Android 开发的游戏开发主菜单屏幕。它需要三个 ImageTextButtons - 播放、设置、注销。这三个按钮中的每一个都有一个与之关联的不同图像,但是,当我运行应用程序时,每个按钮都有相同的图像 - 注销图像。我认为这可能与注销按钮是声明的最后一个按钮有关,因此它可能会覆盖其他按钮的图像?

这是主菜单当前外观的屏幕截图:

如您所见,即使我为每个按钮加载并使用了不同的图像文件,所有按钮上仍显示相同的注销图标。以下是构建和初始化按钮的代码:

private ImageTextButton playBtn, settingsBtn, logoutBtn;

public void initButtons(){
    playBtn = new ImageTextButton("Play", skin, "default");
    playBtn.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("playBtn.png"))));
    playBtn.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("playBtn.png"))));

    settingsBtn = new ImageTextButton("Settings", skin, "default");
    settingsBtn.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("settingsBtn.png"))));
    settingsBtn.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("settingsBtn.png"))));

    logoutBtn = new ImageTextButton("Log Out", skin, "default");
    logoutBtn.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("logoutBtn.png"))));
    logoutBtn.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("logoutBtn.png"))));
}

这是我制作/加载皮肤并调用初始化按钮的方法的 show 方法:

@Override
public void show() {
    Gdx.input.setInputProcessor(stage);

    this.skin = new Skin();
    this.skin.addRegions(MathsVsZombies.manager.get("UI/uiskin.atlas", TextureAtlas.class));
    this.skin.add("default-font", MathsVsZombies.font24);
    this.skin.load(Gdx.files.internal("UI/uiskin.json"));

    initButtons();
    }

为了让 ImageTextButtonStyle 正常工作,我必须将此代码添加到皮肤 JSON 文件中:

"com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle":{
"default": { "down": "default-round-down", "up": "default-round", "font": "default-font", "fontColor": "white" }
  },

与 TextButton 的“默认”样式的代码相同。也许这就是问题所在?我确信图像文件存储在正确的目录下,并且它们都存储在一起。这就是它们应该的样子:

请帮助解决这个问题,因为我对 LibGDX 和 gamedev 的了解非常有限,所以我不知道出了什么问题,更不用说如何修复它了。

android image libgdx scene2d skin
3个回答
4
投票

皮肤将为每个按钮使用相同的样式实例,因此当您 getStyle() 并更新可绘制对象时,使用该样式的每个按钮都将被更新。

通常,您会为皮肤本身中的每个不同按钮类型指定单独的样式,但如果您愿意,也可以在更改可绘制对象之前复制该样式。


1
投票

我通过在皮肤 JSON 文件中创建三种单独的样式来修复此问题,每个样式对应一个特定按钮。

"com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle":{
"play": { "down": "default-round-down", "up": "default-round", "font": "default-font", "fontColor": "white" },
"settings": { "down": "default-round-down", "up": "default-round", "font": "default-font", "fontColor": "white" },
"logout": { "down": "default-round-down", "up": "default-round", "font": "default-font", "fontColor": "white" }

然后在 initButtons 方法中,我将每个样式更改为 JSON 文件中对应的样式。这样,我为每个按钮加载的每个图像文件都会针对该特定样式进行存储(这就是为什么您需要三个单独的样式,否则最近加载的文件将是与“默认”样式关联的文件)。

playBtn = new ImageTextButton("Play", skin, "play");
playBtn.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("playBtn.png"))));
playBtn.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("playBtn.png"))));

settingsBtn = new ImageTextButton("Settings", skin, "settings");
settingsBtn.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("settingsBtn.png"))));
settingsBtn.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("settingsBtn.png"))));

logoutBtn = new ImageTextButton("Log Out", skin, "logout");
logoutBtn.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("logoutBtn.png"))));
logoutBtn.getStyle().imageDown = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("logoutBtn.png"))));

结果: 这是我对主菜单屏幕的预期实现。


0
投票

如果你不想使用样式,你可以做一个简单的子类:

public class TextImageButton extends ImageTextButton {
public TextImageButton(String text, Skin skin,Texture texture) {
    super(text, skin);
    clearChildren();
    add(new Image(texture));
    add(getLabel());
}
}
© www.soinside.com 2019 - 2024. All rights reserved.