2010-02-11 5 views
10

Depuis quelques années, il y a toujours quelque chose à propos de mouseEnabled que je ne reçois pas. J'ai un Sprite (par exemple ici "Sky", qui contient beaucoup d'objets, l'un d'entre eux est un Cloud, que je ne veux pas recevoir d'Evénements Mouse.) Je superpose ce Sky sur d'autres objets d'affichage. visible, mais de ne pas bloquer les événements de souris Si vous voyez un arbre à travers les nuages, vous devriez être en mesure de cliquer sur l'arbreas3 mouseEnabled encore un problème pour moi

Dans la classe Sky:..

mouseEnabled = false; 
cloud.mouseEnabled = false; 
cloud.mouseChildren = false; 

Même avec cette configuration, lorsque le Le nuage est sur l'arbre Je ne peux pas cliquer sur l'arbre parce que le nuage le bloque Pourquoi ???

+3

Prix Triynko la réponse! –

Répondre

3

Vous dites qu'il y a "beaucoup d'objets" là-bas? lse le bloque. Je recommande d'ajouter un écouteur à la scène et vous pouvez voir quel objet est clicks reçoit:

import flash.utils.getQualifiedClassName; 
stage.addEventListener(MouseEvent.CLICK, onClick); 
private function onClick(event:MouseEvent):void 
{ 
    trace(event.target.name, getQualifiedClassName(event.target)); 
} 

Poster plus de code et nous pouvons probablement aider plus.

+0

ok, oubliez la partie "plusieurs objets". Juste un objet que je veux désactivé, et un que je veux activé. L'objet activé est très petit et n'affecte pas cela. Voici ce que je reçois lorsque j'utilise le code que vous avez posté: instance5 flash.display :: Sprite – phil

+0

ok, donc il y a un sprite là-bas sans nom d'instance qui reçoit le clic au lieu du nuage. votre arbre a-t-il un nom d'occurrence? Je donnerais vos noms de clips pour que vous puissiez déterminer lequel bloque réellement. – typeoneerror

26

Même si Sky a mouseEnabled/mouseChildren défini sur false ... il s'agit toujours d'un objet, il occupe toujours de l'espace et reste donc une zone d'accès pour tous les conteneurs PARENT qui n'ont pas mouseEnabled/mouseChildren faux. Par conséquent, je soupçonne que votre objet Sky ne se trouve pas dans le même conteneur parent que votre objet Arborescence. Votre objet Sky a probablement son propre objet conteneur parent, qui est le coupable interceptant les événements. Pour élaborer: Tout objet contenant N'IMPORTE QUOI aura une zone d'accès et interceptera les clics de souris, même si toutes les choses individuelles qu'il contient (formes, objets enfants, etc.) peuvent avoir la valeur mouseEnabled/mouseChildren définie sur false. Par conséquent, même si votre objet Sky a la valeur mouseEnabled sur false, votre Sky (et ses enfants) occupe toujours de l'espace, et donne toujours au conteneur parent de Sky une zone d'accès pour intercepter les événements de la souris. Votre solution consiste donc à s'assurer que tous les conteneurs parents de Sky aient la propriété mouseEnabled définie sur false, au moins jusqu'au premier conteneur ancêtre commun des objets Tree et Sky.

En outre, en mettant mouseEnabled = false et en laissant mouseChildren = true, vous pouvez avoir un conteneur où seulement sélectionner les enfants avec mouseEnabled = true recevoir des événements de clic :)

+0

Merci, j'avais un problème similaire avec les champs de texte, et c'était dans un conteneur qui partageait un ancêtre commun à un bouton. Sans référence directe au conteneur, j'ai pu appeler le parent et définir le paramètre mouseEnabled/Children sur false. – gltovar