Java 在处理libGDX中的按钮时,如何发送(和取消)输入事件?

Java 在处理libGDX中的按钮时,如何发送(和取消)输入事件?,java,libgdx,Java,Libgdx,我正在创建一个基于回合的游戏,其中战场上的每个互动程序都是一个单独的按钮。如果玩家决定移动他的角色,移动范围内的平铺(按钮)将高亮显示(激活)。我还想让路径字符在光标进入移动范围内的任何平铺时都显示出来——我不知道如何处理事件。我尝试将它们发送到路径中的每个磁贴(按钮): final int X=i,Y=j; grid[i][j].addListener(new ClickListener(){ @Override public void enter(InputEvent eve

我正在创建一个基于回合的游戏,其中战场上的每个互动程序都是一个单独的按钮。如果玩家决定移动他的角色,移动范围内的平铺(按钮)将高亮显示(激活)。我还想让路径字符在光标进入移动范围内的任何平铺时都显示出来——我不知道如何处理事件。我尝试将它们发送到路径中的每个磁贴(按钮):

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(事件)会正确高亮显示路径中的每个磁贴,但它不会在事件完成后取消该事件。我似乎找不到一种方法来取消监听器的所有事件和“解决方案”,比如在监听器之外创建一个InputEvent变量,为每个临时磁贴触发()并在需要时取消它——结果是错误的(或者我的代码很糟糕;不幸的是,我还是一个初学者)

我可以临时更改路径中按钮的样式:它将包含常规“向上”图像下的翻滚图像-因此基本上看起来像翻滚。。。没有实际的滚动或处理任何事件。但话说回来,如果知道如何正确地做,那就太好了

所以,我的问题是:有没有一种方法可以轻松地将事件发送到其他按钮,并在需要时取消它们?还是我总是被“肮脏的”(?)解决方案所困扰,比如每次都要改变按钮样式

  • 您应该使用
    ImageButtonStyle
    的功能正确高亮显示按钮,而不是切换样式。定义如下:

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

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

    ...
    {
        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>
    }
    
    。。。
    {
    ClickListener ClickListener=新建ClickListener(){
    @凌驾
    public void enter(InputEvent事件、浮点x、浮点y、int指针、Actor fromActor)
    {
    highlightButtons(fromActor);
    }
    }
    网格[i][j].addListener(单击Listener);
    }
    ...
    公共空白高亮按钮(演员)
    {
    //遍历按钮并突出显示每个按钮的call setChecked
    //要检测正确的按钮,可以使用ArrayMap
    }
    

  • 谢谢,我一直在寻找一种像setChecked(boolean checked)这样的方法——虽然我很确定我知道它,但似乎我当时不知道如何正确管理按钮的样式。我解决了这个问题,每次我想突出显示一个按钮时都会改变样式,但是你的建议要好得多,我肯定会尝试一下。谢谢。
    ...
    {
        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>
    }