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();
}
我正在尝试制作一个 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();
}