2011-03-25 4 views
1

Je travaille sur un jeu Flash simple pour l'école. Dans un niveau, plusieurs ennemis apparaissent et le joueur est censé les abattre. J'ai utilisé removeChild() pour me débarrasser de l'ennemi qui a été abattu, mais quand je clique sur un ennemi, tout sur ma scène est enlevé; ça devient complètement vide.AS3 - removeChild() supprime tout de la scène

La fonction pour remplir ma scène avec des ennemis est le suivant:

private function Game2():void{ 
    for (var i:uint=0; i<50; i++) { 

     var man:MovieClip = new man_mc(); 
     man.x=Math.random()*750; 
     man.y=Math.floor(Math.random()*(70))+350; 
     addChild(man); 
     man.addEventListener(MouseEvent.CLICK, getroffen); 
    } 

fonction des contrôles « getroffen » si un ennemi a été touché:

public function getroffen(evt:MouseEvent):void{ 
      trace("hit"); 
      this.parent.removeChild(this); 

} 

sorte de confusion ici pourquoi il supprime tout sur la scène au lieu d'enlever seulement l'ennemi sur lequel je clique. De l'aide? Merci beaucoup.

Répondre

7

en fonction où est, vous supprimez cette classe (this points à l'objet de portée actuelle), donc je suppose que c'est probablement la classe Main.

Vous devez faire quelque chose comme dans votre fonction de suppression:

var man:MovieClip = evt.target as MovieClip; 
man.parent.removeChild(man); 
+0

Merci. Cela fonctionne bien. Pourriez-vous expliquer quelle est la différence avec le code fourni par Tim S.? Je comprends mieux son code que le vôtre, mais ils semblent tous deux faire l'affaire. – cabaret

+0

Ils sont tous les deux fonctionnellement équivalents. La seule différence est qu'il utilise le paramètre 'currentTarget' (probablement meilleur) au lieu du paramètre' target'. La différence se résume à la façon dont le modèle d'événement fonctionne et à qui vous enregistrez l'écouteur d'événement. Tout ce que je fais est de lancer la cible à un 'MovieClip' (vous pouvez ajouter une vérification pour voir si elle est nulle, puis retourner si vous voulez), puis en appelant c'est' parent' pour le supprimer. Lorsque vous ajoutez un objet 'DisplayObject' à un autre, il devient un enfant de cet objet et a son ensemble de paramètres' parent'. Donc faire 'obj.parent.removeChild (obj)' est un moyen facile de l'enlever – divillysausages

+0

Comme pour la différence 'target' et' currentTarget', le modèle 'Event' en flash a 3 étapes: la phase de capture, la phase événementielle et la phase de bullage. Lorsqu'un objet de la liste d'affichage distribue un événement, il passe 'Stage-> parent-> parent-> parent-> child' où' child' est l'objet qui a envoyé l'événement et 'parent' est chaque parent' DisplayObject' jusqu'à la «scène». Jusqu'au dernier parent, nous sommes en phase de capture. Quand nous atteignons l '«enfant», nous sommes dans la phase de l'événement. Après cela, l'événement revient à la 'Stage'. Donc, en termes de 'target' et' currentTarget', 'target' est l'objet qui a envoyé l'événement, alors que' currentTarget' est l'objet courant dans le 'Stage-> parent-> parent-> Ceci est la phase bouillonnante – divillysausages

3

Au lieu de this.parent.removeChild(this) essayer:

evt.currentTarget.parent.removeChild(evt.currentTarget); 

Cela devrait faire l'affaire! L'événement (mouseEvent) est un 'enfant' de l'un de vos ennemis, donc enlever la cible de votre mouseEvent supprimera l'ennemi.

+0

Merci. Cela a fait l'affaire. Pourriez-vous expliquer ce que signifie réellement le code? Je comprends le evt.currentTarget, mais je ne sais pas d'où vient le 'parent'. Le reste est facile à comprendre aussi. Merci beaucoup! – cabaret

+1

Mes excuses je n'ai pas répondu à cela plus tôt. Le "currentTarget" de l'événement MouseEvent est l'objet auquel vous avez affecté l'EventListener. Parce que je veux supprimer cet objet, je dois d'abord accéder à son parent pour le faire supprimer ses enfants. –

Questions connexes