libGDX鼠标悬停在UI元素上从基础Actor触发相同的事件

时间:2014-05-24 16:06:54

标签: java user-interface libgdx mouseevent scene2d

我正在制作一个简单的RTS游戏。我为地图和UI创建了单独的阶段,并为侧面板使用了scene2D Table类。问题是,当我悬停我的侧面板时,如果此刻面板下有一个演员(建筑物),它会触发其鼠标悬停事件。点击事件正常工作。

这是我的构建类输入监听器:

    public class Building extends Actor {

    addListener(new InputListener(){
                        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                        System.out.println("Click");
                           return true;
                        }
                        public  void    enter(InputEvent event, float x, float y, int pointer, Actor fromActor){
                            ((Building)event.getTarget()).hover = true;
                        }

这是我的小组类听众

public class SidePanel extends Table {
        panelBg = new Image(skin,"side-panel");
        addListener(new InputListener(){
            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                System.out.println("Click");
                return true;
            }
            public  void    enter(InputEvent event, float x, float y, int pointer, Actor fromActor){
System.out.println("Enter");
            }
        });
          addActor(panelBg);
              }
    }

然后将侧面板添加到UI类阶段:

public class UI {
    public  UI(){
        stage = new Stage();
        sidePanel = new SidePanel();
        stage.addActor(sidePanel);
        Gdx.input.setInputProcessor(stage);
      }

最后我将UI添加到主类:

    @Override
    public void create () {
        ui = new UI();
        CP =new InputMultiplexer();
        CP.addProcessor(ui.stage);
        CP.addProcessor(gameStage);
        Gdx.input.setInputProcessor(CP);
    }

不确定问题出在哪里,因为点击事件正常;

1 个答案:

答案 0 :(得分:0)

一个快速的解决方案是让您的Building类检查鼠标是否也在SidePanel上。例如,您可以将构建侦听器的enter方法更改为以下内容:

if (mouseIsOverSidePanel)
    ((Building)event.getTarget()).hover = true;

您的SidePanel听众的enter方法可能是这样的:

mouseIsOverSidePanel = true;

您的SidePanel中的leave方法可以是:

mouseIsOverSidePanel = false;

这主要是伪代码,因此它不会在没有声明变量的情况下工作(显然),但它应该为您提供如何解决问题的基本知识。