libGDX Наведение курсора мыши на элемент пользовательского интерфейса запускает то же событие из базового Актера

Я делаю простую игру RTS. Я создал отдельные этапы для карты и пользовательского интерфейса и использовал класс таблицы scene2D для боковой панели. Проблема в том, что когда я навожу курсор на свою боковую панель, если в данный момент под панелью есть актер (здание), он запускает событие наведения мыши. События щелчка работают правильно.

Вот мои слушатели ввода класса здания:

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

Затем боковая панель добавляется к этапу класса пользовательского интерфейса:

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

И, наконец, я добавил пользовательский интерфейс в основной класс:

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

Не уверен, в чем проблема, потому что событие click работает нормально;


person vitto_primatti    schedule 24.05.2014    source источник
comment
Пожалуйста, включите минимальный пример кода, который по-прежнему показывает ту же ошибку.   -  person Joeytje50    schedule 24.05.2014


Ответы (1)


Одним из быстрых решений было бы, чтобы ваш класс Building проверял, находится ли мышь также над боковой панелью. Например, вы можете изменить метод enter прослушивателя Building на что-то вроде этого:

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

Метод enter слушателя SidePanel может выглядеть примерно так:

mouseIsOverSidePanel = true;

И ваш метод leave в вашей боковой панели может быть:

mouseIsOverSidePanel = false;

Это в основном псевдокод, поэтому он не будет работать без объявления переменных (очевидно), но он должен дать вам общее представление о том, как решить вашу проблему.

person hyrumcoop    schedule 25.05.2014
comment
Да, это работает. (Хотя это кажется довольно очевидным, как так вышло, я сам этого не понял :() Большое спасибо - person vitto_primatti; 25.05.2014