2015-12-03 96 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