2015-12-03 2 views
2

У меня есть две стороны:Как я могу отделить слушателя Stage и InputProcessor слушателя - libGDX

enter image description here

и:

enter image description here

Я добавил в первую очередь синий актера на сцену и во-вторых, красный актор:

blueActor.setPosition(100, 100, Align.center); 
redActor.setPosition(100 - 20, 100 + 20, Align.center); 

blueActor.addListener(blueListener); 
redActor.addListener(redListener); 

stage.addActor(blueActor); 
stage.addActor(redActor); 

Эти актеры выглядят так:

enter image description here

Их слушатели InputListener зависят от их ZIndex с, если их Touchable являются enable, как показано ниже:

enter image description here

До сих пор все работает отлично, если входной процессор экрана только этап:

Gdx.input.setInputProcessors(stage); 

НО если входной процессор экрана два процессора Stage и InputProcessor,

inputMultiplexer = new InputMultiplexer(this, stage); 
Gdx.input.setInputProcessor(inputMultiplexer); 

обоих актеров будут затронуты, как показано:

enter image description here

В этом случае КАК Могу ли я отделить двух слушателей этих актеров, как в первом случае?

+0

Хотя на самом деле я думаю, m делая ряд предположений. Красный и синий оба по-прежнему находятся на «Сцене»? Как выглядят ваши обработчики событий? – DoubleDouble

+0

КРАСНЫЙ на слушателе сцены, но ГОЛУБОЙ на интерфейсе входного процессора – Crowni

+0

метод приземления сценического ретунда true, но приземление и методы прикосновения входного процессора возвращают false – Crowni

ответ

1

Выполнение the source code, конструктор Multiplexer добавляет ваши аргументы в том порядке, в котором вы их добавляете.

public InputMultiplexer (InputProcessor... processors) { 
    for (int i = 0; i < processors.length; i++) 
     this.processors.add(processors[i]); 
} 

Тогда на touchDown случае, она проходит через них в том же порядке.

public boolean touchDown (int screenX, int screenY, int pointer, int button) { 
    for (int i = 0, n = processors.size; i < n; i++) 
     if (processors.get(i).touchDown(screenX, screenY, pointer, button)) return true; 
    return false; 
} 

Обратите внимание, что как только любое возвращается true, оно также возвращает true и останавливает цикл.


Так что, когда вы это делаете:

inputMultiplexer = new InputMultiplexer(this, stage); 

это делает touchDown для this первого, а затем stage. Поскольку Red находится на сцене, вы захотите переключить порядок так, чтобы Red сначала обрабатывал события.

inputMultiplexer = new InputMultiplexer(stage, this); 

Однако, скажем, у вас теперь есть зеленый цвет, который также находится на сцене, но, как предполагается, за * Синий.Вам нужно будет создать свой собственный класс Multiplexer, возможно, дочерний элемент и просто переопределить touchDown, а также объединить/отсортировать слушателей объектов в каждом процессоре, используя собственный метод, который использует zIndex для определения порядка

+0

да, но я больше не могу прикасаться к синему актеру, который во втором индексе процессоров! – Crowni

+0

@iOleX, даже если перед ним нет КРАСНОГО актера? Убедитесь, что RED (* и сцена вообще *) возвращает * false * в мультиплексор, если они не обрабатывают событие. – DoubleDouble

+0

есть метод вроде 'stage.setTouchable (Touchable.disable);' сделать актеров только выше на inputprocessor – Crowni

Смежные вопросы