3

我創建了一個使用Starling層(遊戲本身)和包含多個Popups和Stuff的經典顯示列表的遊戲。停止MouseEvent - 將displayList視圖傳播到starling視圖

我有一件事困擾着我: 如果在displayList-elements上生成MouseEvent,它們總是會通過Starling層併產生TouchEvents等,這非常煩人。

我想知道有一些一般(和易於使用)的方法來處理。

的一個可能性是偵聽所有顯示列表式元件以下活動:

interfaceElement.addEventListener(MouseEvent.MOUSE_MOVE, stopPropagationHandler); 
interfaceElement.addEventListener(MouseEvent.MOUSE_DOWN, stopPropagationHandler); 
interfaceElement.addEventListener(MouseEvent.MOUSE_UP, stopPropagationHandler); 

private function stopPropagationHandler(e:MouseEvent):void { 
    e.stopPropagation(); 
} 

但是,這看起來很討厭我。 即使我這樣做,我還有一個問題: 如果椋鳥元素低於該display-list-element,並且它具有用於翻轉行爲的TouchEvent.TOUCH >>翻轉外觀不會如果您將鼠標懸停在display-list-element上,則將其從Starling中移除。

我也想過在每個顯示列表元素後面放置一個虛擬椋鳥元素......以阻止這些事件......但是對於這樣一個「簡單」任務而言,這聽起來有點「過於複雜」。 或者我錯過了什麼?

提示將不勝感激。 謝謝。

+0

我想說利用全球可用的標誌,而不是事件傳播塊,如果一個模式彈出在比賽將要設置,所以Starling級別的每個事件處理程序將首先檢查它是否已設置,如果已設置則返回,以便Starling部分的SWF將表現爲在彈出窗口中沒有任何事情發生。 – Vesper

+0

@Vesper謝謝..但正如你已經提到過,這隻適用於模態。 :/ 我另外有例如可以始終可見的聊天。 – Roman

回答

1

您可以在顯示列表(不是舞臺)中創建1個主容器,並監聽ROLL_OVER和ROLL_OUT,並在其中設置一些全局標誌,以確保鼠標位於顯示列表容器上。然後在你的八哥事件中,檢查這個標誌。這是不是最好的解決辦法在那裏我猜,但它應該工作

var isOverDisplayList:Boolean = false; 
container.addEventListener(MouseEvent.ROLL_OVER, onRollOver); 
container.addEventListener(MouseEvent.ROLL_OUT, onRollOut); 

function onRollOver(e:MouseEvent) { 
    isOverDisplayList = true; 
} 

function onRollOut(e:MouseEvent) { 
    isOverDisplayList = false; 
} 
+1

不錯的想法..至少我會擺脫最惱火我的MOUSE_MOVE-listener。 因此,它似乎並不像他們是一些「內置」的行爲,我錯過了......可惜。 – Roman

+0

我注意到我有2 ROLL_OVER事件。改變它以糾正事件 – Marijn

+0

我現在通過滾動事件>>實現它,但不是設置變量,而是切換Starling-Blocker的可見性,它位於所有Starling視圖之上。謝謝! – Roman