2009-08-16 4 views
0

J'ai un petit sprite qui est la "traînée de fumée" derrière un missile dans une animation flash. J'ai fait une classe autonome pour gérer la création et la suppression de lui-même:EventListeners s'enregistrant eux-mêmes?

public class Spark extends Sprite { 
    private var lifetime:Number = 15; 
    private var gfxRef:MovieClip = new fx_particleTrail(); 
    private var canvas:Sprite; 

    public function Spark(x:Number, y:Number, to:Sprite) { 
     gfxRef.x = x; 
     gfxRef.y = y; 
     canvas = to; 
     canvas.addChild(gfxRef); 
     addEventListener(Event.ENTER_FRAME, tick); 
    } 

    private function tick(e:Event):void { 
     lifetime --; 
     gfxRef.alpha -= 0.05; 
     if (lifetime <= 0) { 
      gfxRef.alpha = 0; 
      removeEventListener(Event.ENTER_FRAME, tick); 
      canvas.removeChild(gfxRef); 
      gfxRef = null; 
     } 
    } 
} 

Tout semble fonctionner très bien - je ne peux pas tracer des erreurs de cette routine. Cependant, parfois une étincelle restera collée à l'écran pour toujours - le compteur de durée de vie s'arrête à un certain nombre et ne progresse jamais. C'est comme si le EventListener venait de décider d'abandonner le fantôme. Je suis assez sûr que ce n'est pas l'initialisation car ils vont échouer dans divers états d'Alpha-tude, indiquant qu'il y a une panne de masse à un moment ou un autre.

Je pensais que peut-être générer tant à la fois était un problème, mais je truqué pour générer un seul - et je jeté quelques traces:

> Born 
    > 15 
    > 14 
    > 13 
    > 12 

Et elle se termine là. L'écouteur d'événement a été placé et il s'est simplement arrêté pour une raison quelconque! S

Cela fonctionne avec FlexSDK dans AS3/Bloc-notes (n'utilisant pas l'environnement de développement Flash).

Aide!

Répondre

1

Il n'y a rien de mal immédiatement avec votre code. J'ai un fort soupçon que le problème n'est pas dans le code que vous avez posté, mais ailleurs. Si je prends votre code exact et l'exécute (tout en commentant les choses liées à gfx) il compte jusqu'à 0 comme prévu.

Qu'est-ce qui gère le Spark (ou la collection d'étincelles)? Êtes-vous sûr que la durée de vie de chaque instance de Spark est suffisamment longue? Enfin, votre approche générale n'est pas très efficace.

Avoir chaque Spark avec son propre écouteur d'événement n'est pas strictement nécessaire et vous devriez considérer une classe qui a une seule boucle de mise à jour et qui gère tous les Sparks. Jetez un oeil à certains systèmes de particules existants comme flint particles.

+0

Peut-être le questionneur pourrait-il afficher son projet, s'il se sent à l'aise de le faire? – aaaidan

+0

Hm, vous semblez absolument raison! On dirait que le contenu de la classe a été récupéré un peu plus tôt. Merci pour les conseils! –

0

Une chose qui pourrait en être la cause est l'instanciation du gfxRef en dehors du constructeur. Je sais avec certitude que si vous faites ceci à un tableau, il deviendra une variable statique, partagée par tous les objets. Essayez de l'instancier dans le constructeur à la place.

Et vous n'avez pas vraiment besoin de gfxRef de toute façon, vous pouvez simplement utiliser la classe, car elle étend Sprite. Supprimez le gfxRef et remplacez toutes les références à à la place par. Ensuite, attachez-le à un clip que vous faites en flash, et dessinez un nuage de fumée dans ce MovieClip.

+1

"Je sais avec certitude que si vous faites cela à un tableau, il deviendra une variable statique, partagée par tous les objets." Ceci est seulement un problème dans Actionscript 2. Les classes Actionscript 3 gèrent correctement ces propriétés en tant que propriétés de membre et non en tant que propriétés statiques. –