2016-09-04 2 views
0

Я пытаюсь сделать ui, где пользователь может выбрать, какой элемент использовать, что-то похожее на minecraft, но я не уверен, какой виджет используется в этой игре. Я сделал несколько кнопок и добавил их в таблицу, чтобы они были выровнены. Но проблема с кнопками заключается в том, что нет способа узнать, выбран ли элемент, потому что после его нажатия он просто переходит к его оригинальному виду.Кнопки Libgdx Scene2d, как в Minecraft

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

Используйте ChangeListener вместо ClickListener. Используйте стиль кнопки с отмеченным Drawable, когда кнопка переключается. – Tenfour04

+0

Я сделал то, что вы сказали, но теперь проблема заключается в том, как автоматически отключить кнопку при нажатии другой кнопки, вместо того, чтобы щелкнуть, чтобы включить, и нажмите еще раз, чтобы отключить. Что мне следует включить в changeListener? –

ответ

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

Вы, кажется, используете Strings для отслеживания выбранного инструмента. Поскольку вы используете Strings, вы можете удобно называть свои кнопки с помощью строкового значения, а затем использовать это в методе setSelectedTool. Например:

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

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

Но струны не являются надежным способом отслеживания этого. Действительно, вы должны использовать Enum. Если вы используете перечисления, вы можете сохранить их в объекте пользователя 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(); 
} 
Смежные вопросы