【问题标题】:How to send (and cancel) input events when dealing with buttons in libGDX?处理 libGDX 中的按钮时如何发送(和取消)输入事件?
【发布时间】:2013-12-15 22:16:36
【问题描述】:

我正在创建一个回合制游戏,其中战场上的每个图块都是一个单独的按钮。如果玩家决定移动他的角色,移动范围内的图块(按钮)会突出显示(激活)。我还想让路径字符在每次光标进入移动范围内的任何图块时都显示出来——我不确定如何处理事件。我试过简单地将它们发送到路径中的每个图块(按钮):

final int X=i,Y=j;
grid[i][j].addListener(new ClickListener(){
    @Override
    public void enter(InputEvent event,float x,float y,int pointer,Actor fromActor)
    {
        if(isMovementActivated&&!grid[X][Y].isDisabled()&&!isParentActivated)
        {
            isParentActivated=true;
            Tile temp = grid[X][Y];
            while(temp.parent!=null&&temp.parent.isEmpty())
            {
                temp=temp.parent;
                temp.fire(event);
            }
            isParentActivated=false;
        }
      }
}
});

(isParentActivated 的存在是为了防止路径中以前的图块进入代码的同一部分。如果我是对的,否则他们只会向已经突出显示的图块发送越来越多的事件。 检查 temp.parent.isEmpty() 是否阻止突出显示字符本身:它仅对没有障碍物的图块返回 true。)

虽然 temp.fire(event) 正确突出显示路径中的每个图块,但它不会在完成后取消事件。我似乎无法找到一种方法来取消侦听器的所有事件和“解决方案”,例如在侦听器之外创建一个 InputEvent 变量,为每个临时图块触发()它并在需要时取消它 - 结果是错误的(或者我的代码很糟糕;不幸的是,我还是个初学者)。

我可以暂时更改路径中按钮的样式:它将在常规“向上”图像下包含翻转图像 - 所以基本上它看起来像翻转了......而实际上没有翻转或处理任何事件全部。但话又说回来,如果知道如何正确地做到这一点,那就太好了。

所以,我的问题是:有没有一种方法可以轻松地将事件发送到其他按钮并在需要时取消它们?或者我是否坚持使用“肮脏”(?)解决方案,例如每次更改 ButtonStyle?

【问题讨论】:

    标签: java libgdx


    【解决方案1】:
    1. 您应该使用ImageButtonStyle 的强大功能来正确突出显示按钮,而不是切换样式。定义这样的style:

      "some-button": {
          "imageUp": "default state of button",
          "imageDown": "button is clicked",
          "imageOver": "button with mouse over",
          "imageChecked": "highlighted state (like imageUp but checked)",
          "imageCheckedOver": "highlighted state with mouse over"
      }
      

      并调用按钮的setChecked(boolean checked)方法使其高亮。

    2. 以这种方式使用事件是个坏主意。你不应该手动发送事件,你可以调用一些方法。

      ...
      {
          ClickListener clickListener = new ClickListener(){
              @Override
              public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor)
              {
                 highlightButtons(fromActor);
              }
          }
      
          grid[i][j].addListener(clickListener);
      }
      ...
      
      public void highlightButtons(Actor actor)
      {
          // iterate through the buttons and call setChecked of each button should be highlighted 
          // to detect right buttons you could use ArrayMap<ImageButton, YourClass>
      }
      

    【讨论】:

    • 谢谢,我一直在寻找像 setChecked(boolean checked) 这样的方法——虽然我很确定我知道它,但似乎我不知道如何管理样式那时正确的按钮。每次我想突出显示一个按钮时,我都通过更改样式来解决这个问题,但是您的建议要好得多,我肯定会尝试一下。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2013-04-17
    • 2012-07-14
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多