2009-10-13 4 views
0

У меня есть проект, который включает в себя опрос аппаратных средств переключения каждое обновление и преобразование его состояния в качестве пользовательских событий:Эмуляция Mouse Event AS3

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

Аппаратный переключатель действует аналогично две кнопки мыши в. Поэтому я хотел бы иметь возможность «вводить» пользовательские события ToggleSwitchEvent в Список отображения и действовать так же, как MouseEvent, вырываясь из объекта InteractionObject, с которым пересекает клик. Это позволило бы мне добавить EventListener в список отображения так же, как и с MouseEvents.

Проблема, насколько я понимаю, заключается в том, что мне понадобится ссылка на листовые узлы DisplayList для вставки моего ToggleSwitchEvent вручную. Я хотел бы сказать, что переключатель был нажат на определенную позицию на экране, и отобразите DisplayList, что InteractionObject клик пересекает и отправляет мой ToggleSwitchEvent вместо MouseEvent.

Есть ли способ эмулировать MouseEvent в AS3, но с помощью специального события?

+0

ответ обновлен ... greetz – back2dos

ответ

2

Я не совсем понимаю ... вы хотите, чтобы пользовательское событие пузырилось или стреляло MouseEvent?

  1. любое событие будет пузыриться, как и следовало ожидать, если его свойство bubbles устанавливается истина ...
  2. если вы отправлять события мыши вручную, они будут также пузырь, и даже их stageX и stageY рассчитывается надлежащим образом .. .

так что удачи затем ...;)


редактировать:

ok, ну, список отображения на самом деле не позаботится об этом для вас ... на самом деле у вас есть два варианта ... начинайте на сцене и пробирайтесь сквозь нее, всегда держась под мышкой. .. или, начните с объекта под мышью, найдите его путь в дереве и найдите правильный 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, это то, что я думал, что мне придется делать. Спасибо за подробный ответ. –