Libgdx 类似于 Minecraft 中的 Scene2d 按钮

Libgdx Scene2d buttons like in Minecraft

我正在尝试制作一个 ui 用户可以 select 使用什么物品,类似于 minecraft 的东西,但我不确定该游戏使用哪种小部件.我所做的是制作几个按钮并将它们添加到 table 以便它们对齐。但是按钮的问题是无法知道某个项目是否被 selected,因为点击它后它会恢复到原来的样子。

btnCube = new TextButton("Cube", btnStyle);

        btnCube.addListener(new ClickListener(){
            @Override
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                WorldController.element = "cube";
                super.touchUp(event, x, y, pointer, button);
            }
        }); 

对我来说,我只是将一个字符串设置为某个文本,然后当玩家点击屏幕时它会生成该对象,有没有更好的方法呢?因为我认为仅依靠 select 项的字符串是不合适的。

这就是我所说的,您可以看到红色项目被突出显示,因为它是 selected 而其余的不是。

为所有按钮提供相同的更改侦听器。它会在切换按钮时调用其 changed 方法。但是,由于您不希望按钮能够通过单击从打开切换到关闭,因此您应该手动将更改应用到所有按钮。所以先把整组按钮放到一个Set里。

然后当调用 changed 时,您将知道刚刚按下了哪个按钮,因此您可以将所有按钮的状态更改为适当的状态。

private ObjectSet<Button> toolButtons = new ObjectSet(); //put all buttons into this

//add this same listener to all buttons.
ChangeListener commonListener = new ChangeListener(){
    public void changed (ChangeEvent event, Actor actor){
        for (Button button : toolButtons){
            button.setChecked(button == actor);
        }
        setSelectedTool((Button)actor);
    }
};

void setSelectedTool(Button button){
    //however you are tracking the selected tool, you can apply the change
    //here based on which button was pressed
}

//Also need to set programmatic change events false on all buttons to prevent stack overflow
for (Button button : toolButtons)
    button.setProgrammaticChangeEvents(false);

您似乎在使用字符串来跟踪选择了哪个工具。由于您使用的是字符串,因此可以使用字符串值方便地命名按钮,然后在 setSelectedTool 方法中使用它。例如:

btnCube = new TextButton("Cube", btnStyle);
btnCube.setName("cube");
btnCube.addListener(commonListener);
toolButtons.add(btnCube);

//...
void setSelectedTool(Button button){
    WorldController.element = button.getName();
}

但是字符串并不是一种可靠的跟踪方式。真的,你应该使用枚举。如果您使用枚举,您可以将它们存储在 Button 的用户对象中:

btnCube = new TextButton("Cube", btnStyle);
btnCube.setUserObject(ElementType.CUBE); //example enum you need to create
btnCube.addListener(commonListener);
toolButtons.add(btnCube);

//...
void setSelectedTool(Button button){
    WorldController.element = (ElementType)button.getUserObject();
}