2009-10-13 8 views
0

J'ai un projet qui implique l'interrogation d'un matériel chaque commutateur mise à jour et la conversion de ses états à un des événements personnalisés:Émulation souris événement AS3

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

Le commutateur matériel agit semblable à une souris à deux boutons. Je voudrais donc pouvoir "injecter" les événements ToggleSwitchEvent personnalisés dans la liste d'affichage et les faire agir comme un MouseEvent, en faisant des bulles à partir de l'InteractionObject avec lequel le clic se croise. Cela me permettrait d'ajouter EventListener à la liste d'affichage comme je le fais avec MouseEvents. Le problème, autant que je le comprends, est que j'aurais besoin d'une référence aux nœuds feuille de la DisplayList pour insérer manuellement mon ToggleSwitchEvent. Je voudrais dire que le commutateur a été cliqué à une certaine position sur l'écran, et que la DisplayList détermine quel InteractionObject le clic recoupe et distribue mon ToggleSwitchEvent au lieu d'un MouseEvent.

Existe-t-il une méthode pour émuler le MouseEvent dans AS3 mais en utilisant un événement personnalisé?

+0

réponse mise à jour ... greetz – back2dos

Répondre

2

Je ne comprends pas très bien ... voulez-vous qu'un événement personnalisé éclate ou que vous déclenchiez MouseEvent s par vous-même?

  1. tout état de cause se propagera comme prévu, si sa bubbles propriété est définie sur true ...
  2. si vous décomposez les événements de souris manuellement, ils gargouille-, et même leur stageX et stageY est calculé de façon appropriée .. .

si bonne chance alors ...;)


modifier:

ok, eh bien la liste d'affichage ne s'occupera pas vraiment de cela pour vous ... en fait, vous avez deux options ... commencer à la scène, et faire votre chemin à travers elle, en gardant toujours sous la souris. .. ou, commencer à l'objet sous la souris, obtenir son chemin dans l'arbre, et trouver le droit InteractiveObject dans sa chaîne parente ... ce dernier peut être fait en utilisant DisplayObjectContainer::getObjectsUnderPoint ... voici le code ...

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

vous pouvez réellement injecter le droit coordonne dans l'événement, mais je suppose que vous allez comprendre cela ...;)


+0

J'ai mis à jour la question –

+0

Le bouillonnement n'est pas le problème, plus, je voudrais ne pas avoir à comprendre quel InteractionObject le ToggleButtonEvent devrait être expédiée. Je voudrais que la DisplayList puisse le faire pour moi –

+0

Merci back2Dos, c'est ce que je pensais devoir faire. Merci pour la réponse détaillée. –

Questions connexes