【问题标题】:Libgdx Scene2d buttons like in MinecraftLibgdx Scene2d 按钮,就像在 Minecraft 中一样
【发布时间】:2016-09-04 16:42:29
【问题描述】:

我正在尝试制作一个用户界面,用户可以在其中选择要使用的物品,类似于我的世界,但我不确定该游戏使用哪种小部件。我所做的是制作几个按钮并将它们添加到表格中,以便它们对齐。但是按钮的问题是无法知道一个项目是否被选中,因为点击后它只是回到原来的样子。

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

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

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

【问题讨论】:

  • 使用 ChangeListener 而不是 ClickListener。在切换按钮时使用带有选中 Drawable 的按钮样式。
  • 我按照你说的做了,但现在的问题是如何在单击另一个按钮时自动禁用一个按钮,而不是单击以启用并再次单击以禁用。我应该在 changeListener 里面放什么?

标签: java libgdx scene2d


【解决方案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();
}

但字符串并不是一种可靠的跟踪方式。真的你应该使用枚举。如果你使用枚举,你可以将它们存储在 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();
}

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多