2015-12-03 158 views
2

我有两个参与者:我怎么能分出舞台监听器和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■如果显示出他们Touchableenable为:如果输入处理器

enter image description here

到目前为止,一切工作正常屏幕是只有阶段:

Gdx.input.setInputProcessors(stage); 

BUT如果屏幕的输入处理器的两个处理器StageInputProcessor

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

两个行动者将被触摸的,如下所示:

enter image description here

在这种情况下如何我可以在第一种情况下分开这些演员的两个监听器怎么样?

+0

虽然实际上,我猜我'米做了一些假设。红色和蓝色都仍然在舞台上?你的事件处理程序目前是什么样的? – DoubleDouble

+0

舞台监听器上的红色,但输入处理器界面上的蓝色 – Crowni

+0

舞台retuern的达阵方法true,但输入处理器的touchdown和touchup方法返回false – Crowni

回答

1

经过the source codeMultiplexer的构造函数按照添加它们的顺序添加您的参数。

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

它是做touchDownthis第一,然后stage。由于红色在舞台上,您需要像这样切换顺序,以便红色可以首先处理事件。

inputMultiplexer = new InputMultiplexer(stage, this); 

但是,假设你现在有绿色,这也是在舞台上,但被认为是背后*蓝。你必须创建你自己的Multiplexer类,可能是一个孩子,只是覆盖touchDown,并结合/排序在每个处理器中的对象监听器使用自己的方法,它使用zIndex来决定顺序

+0

是的,但我不能再触摸蓝色演员,它在处理器的第二个索引中! – Crowni

+0

@iOleX即使在它面前没有RED演员?确保RED(*和通常的场景*)在未处理事件时将* false *返回给多路复用器。 – DoubleDouble

+0

有没有类似'stage.setTouchable(Touchable.disable)'的方法;'为了让演员只能在输入处理器 – Crowni