像Minecraft

时间:2016-09-04 16:42:30

标签: java libgdx scene2d

我正在尝试创建一个用户可以选择要使用的项目的ui,类似于我的世界,但我不确定该游戏使用的是哪种小部件。我做的是制作一些按钮并将它们添加到一个表中,以便它们对齐。但是按钮的问题在于无法知道某个项目是否被选中,因为在点击它之后它只是转到它的原始外观。

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);
            }
        }); 

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

enter image description here

这就是我所说的,因为你可以看到红色项目被突出显示,因为它被选中而其余项目没有被选中。

1 个答案:

答案 0 :(得分:1)

为所有按钮提供相同的更改侦听器。当切换按钮时,它会调用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();
}

但Strings不是一种强有力的方法来跟踪这一点。真的,你应该使用枚举。如果您使用枚举,则可以将它们存储在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();
}