2012-03-14 1 views
2

Exécutez le code suivant, une fois avec block.mouseEnabled = true et de nouveau avec block.mouseEnabled = false, en cliquant une fois sur le bloc lors de chaque exécution.Dans AS3, pourquoi les événements de souris semblent-ils sauter "root" et aller à "stage"?

var block:Sprite = new Sprite(); 
block.name = "block"; 
with(block.graphics){beginFill(0x000000,1);moveTo(0,0);lineTo(100,0);lineTo(100,100);lineTo(0,100);lineTo(0,0);endFill();} 
block.mouseEnabled = true; //change to false to see how event target skips root 
addChild(block) 
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down, false, 0, true); 
function mouse_down(e:MouseEvent):void{trace(e.target);} 

Pourquoi "root" est-il ignoré comme cible? Est-ce par conception? Quelle est ou quelle pourrait être la raison de conception de cette anomalie?

Je demande cela parce que c'est une rupture nette par rapport au modèle normal où lorsque l'objet enfant a mouseEnabled défini sur false, le parent devient la cible lorsque l'on clique sur la zone enfant.

Il se peut que la racine soit simplement un point de terminaison non-participant dans la capture d'événement/cible/bouillonnement-voyage, et tout ce qui l'atteint est appliqué à la scène au lieu de la racine.

+2

** Note du modérateur ** * Les commentaires sous cette question ont été purgés car ils se sont dissous dans le bruit pur, aucun signal. S'il vous plaît éviter des discussions prolongées ou des arguments dans les commentaires, utilisez plutôt le chat. * –

+0

C'est vraiment intéressant. Vous pouvez envoyer manuellement un événement de souris sur la racine, et il se déclenchera sur la scène comme prévu, mais aucune interaction de la souris avec des formes ou des graphiques attachés ou dessinés sur la racine ne fera que la racine devienne la cible; il est toujours par défaut à la scène à la place. À tout le moins, il est bon de savoir que vous pouvez dessiner partout sur la racine sans que de tels graphiques n'interfèrent avec l'interaction de la souris, et fonctionnent efficacement comme arrière-plan de scène (plutôt que comme arrière-plan racine). – Triynko

+3

Voir mes commentaires sur Martys answer. L'objet racine est relatif. Dans le cas de stage, stage.root == stage. C'est, c'est une référence circulaire. La cible de l'objet ne sera jamais définie sur "root" car elle est déjà définie sur la racine, c'est-à-dire sur la scène. –

Répondre

1

Les traits et les remplissages vectoriels sur les graphiques ne sont pas interactifs et ne peuvent pas intercepter les événements interactifs. Vous pouvez utiliser la méthode graphics.beginBitmapFill ou ajouter Bitmap (ou tout autre) en tant qu'enfant.

Questions connexes