2009-10-13 118 views
0

我有涉及輪詢硬件開關每次更新和轉換其狀態爲自定義事件的一個項目:仿真鼠標事件AS3

ToggleSwitchEvent.BackWardButtonDown 
ToggleSwitchEvent.BackWardButtonUp 
ToggleSwitchEvent.Click 
etc .... 

硬件開關的作用類似於一個兩個鍵鼠標。所以我希望能夠將自定義的ToggleSwitchEvent事件「注入」到顯示列表中,並讓它像MouseEvent一樣工作,從點擊交叉的InteractionObject中冒出來。這將允許我像顯示MouseEvents一樣將EventListener添加到顯示列表中。

就我所知,麻煩在於我需要引用DisplayList的葉節點來手動插入我的ToggleSwitchEvent。我想說,交換機在屏幕上的某個位置被點擊,並讓DisplayList找出點擊交互對象的InteractionObject,並分配我的ToggleSwitchEvent而不是MouseEvent。

是否有一種方法來模擬AS3中的MouseEvent,但使用自定義事件?

+0

答案更新... greetz – back2dos

回答

2

我不太明白...你是否想要自定義事件來泡泡或自行激發MouseEvent

  1. 任何事件將不如預期,如果bubbles屬性設置爲true ...
  2. 如果手動調度鼠標事件,他們也會泡沫,甚至他們stageXstageY適當計算泡沫.. 。

那麼好那麼...好運;)


編輯:

好吧,顯示列表並不會真正照顧到你......實際上,你有兩個選擇......從舞臺開始,通過它,始終保持在鼠標下。 ..或者,從鼠標下的對象開始,在樹中找到它的路徑,並在其父鏈中找到正確的InteractiveObject ...後者可以使用DisplayObjectContainer::getObjectsUnderPoint ...這裏是代碼...

public static function dispatchEventUnderMouse(event:Event, stage:Stage, point:Point):Boolean { 
    //return if stage is disabled 
    if (!stage.mouseEnabled) return false; 
    //find the topmost object 
    var cur:DisplayObject = stage.getObjectsUnderPoint(point).pop(); 
    if (cur == null) cur = stage; 
    //build the path 
    var path:Array = []; 
    while (cur != null) { 
     path.push(cur); 
     cur = cur.parent; 
    } 
    //traverse the path from the root to find the right InteractiveObject 
    while (path.length > 0) { 
     cur = path.pop(); 
     if (cur is InteractiveObject) { 
      if (!(cur as InteractiveObject).mouseEnabled) { 
       cur = cur.parent; 
       break; 
      } 
      if (cur is DisplayObjectContainer) { 
       if (!(cur as DisplayObjectContainer).mouseChildren) break; 
      } 
     } 
     else { 
      cur = cur.parent; 
      break;     
     } 
    } 
    return cur.dispatchEvent(event); 
} 

你可能真的要注入正確的座標轉換成大事,但我想你會明白這一點...;)


+0

我已更新問題 –

+0

冒泡不是問題,更多,我想不必知道什麼InteractionObject應該從ToggleButtonEvent派發。我想如果DisplayList可以爲我做到這一點 –

+0

謝謝back2Dos,這是我認爲我必須做的。感謝您的詳細回覆。 –