Question

J'ai besoin d'aide! Je ne doute pas que c'est un problème stupide que je suis un peu plus pensé au point que je suis muet à ce sujet.

J'ai une « principale » instance d'un symbole MovieClip (Appelons-Montagne) avec une classe d'accompagnement. Dans le flux du programme, je produis automatiquement 8 autres instances du même symbole, disons, chacun a une autre couleur de remplissage. Lorsque je clique sur un de ceux, je voulais automatiquement générés l'instance principale pour changer la couleur de la couleur que celui généré automatiquement a été.

Ainsi, après la génération dynamique de l'article dans une autre classe, je a ajouté un eventListener pour MouseClick

var thisMountain=new Mountain; 
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);

Mais c'est quand j'ai réalisé que le eventListener avait aucun moyen de dire la fonction qu'il appelle, l'instance du symbole a été cliqué. Je suis donc allé et a ajouté l'écouteur d'événement dans la classe « Montagne », mais il est d'être appelé, même si le principal est cliqué. Donc, j'ai ajouté un booléen lorsque l'instance est créée pour différencier, mais qui semble comme codage terrible terrible.

Alors, que dois-je faire? Est-ce bon exemple? Dois-je faire encore une autre classe qui étend la classe de montagne ou quelque chose? Quelle est la meilleure façon de s'y prendre pour le faire?

Était-ce utile?

La solution

Vous pourriez faire quelque chose comme:

item1.addEventListener(MouseEvent.CLICK, itemClicked);
item2.addEventListener(MouseEvent.CLICK, itemClicked);
item3.addEventListener(MouseEvent.CLICK, itemClicked);
...
...
function itemClicked(e:MouseEvent):void{
 trace((e.currentTarget as MyInstances).myColor);
}

mais si vous créez les éléments dans une catégorie distincte et ne savait pas l'instance ou le nombre créé, etc., etc. qui pourraient vous intéresser regarder en « événements personnalisés ». Vos articles lorsque vous cliquez dessus tireraient un large événement quelque chose comme ce qui suit.

var myItemClickedEvt:MyCustomEvent = new MyCustomeEvent("itemClicked", myColor);

Vous pouvez ensuite écouter l'événement « itemClicked » et de faire quelque chose comme alors:

function itemClicked(e:MyCustomeEvent):void{
     trace(e.myColor);
}

... mais je suis probablement confondre la situation ... vous avez probablement juste besoin:

(e.currentTarget as MyInstances).myColor

Autres conseils

il suffit d'ajouter une variable identifiant à votre classe de montagne:

var thisMountain=new Mountain('id1'); 
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);
function itemClicked(e:MouseEvent):void{
    trace((e.currentTarget as Mountain).id);
}

Peut-être que je ne comprends pas votre scénario, mais pourquoi vous ne pourriez pas simplement utiliser la propriété event.target? Est-ce pas ce dont vous avez besoin? En supposant que Mountain étendu un DisplayObject, vous devriez avoir une référence à l'objet en question.

Par exemple:

thisMountain.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
    // do something with evt.target;
});

Pas un problème stupide, mais heureusement, il y a une solution simple:
Utilisez le cible de l'MouseEvent.
Donc, votre gestionnaire d'événements ressemblerait à quelque chose comme ceci:

protected function itemClicked(e:MouseEvent):void {
    var clickedMountain:Mountain = e.target as Mountain; // cast target as a Mountain
    var mountainColor:Color = clickedMountain.mountainColor;

    // do something here to set the color of the main mountain
}

Selon la façon dont votre clip Montagne est configuré, vous devrez peut-être utiliser currentTarget au lieu de cible pour vous assurer que vous obtenez la montagne, et non l'un des ses enfants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top