2010-09-08 9 views
1

J'ai un MovieClip qui a dans les actions cadre 1Quand le script d'image Flash est-il exécuté exactement?

this["myCustomVar"] = "bla"; 

Je fais alors ceci:

var mc:MovieClip = new MyMovieClip(); 
trace(mc.hasOwnProperty("myCustomVar")); // is false 

Pourquoi le MovieClip pas myCustomVar, ou de le mettre de façon plus générale:

Quand les scripts d'image dans les clips sont-ils exécutés exactement?

Répondre

1

si vous utilisez le flash 10 puis il y a 7 événements par image:

  1. événement de type d'événement Event.ENTER_FRAME expédié
  2. Code constructeur de MovieClips enfants est exécuté
  3. événement de type d'événement Event.FRAME_CONSTRUCTED expédié
  4. Les actions des cadres MovieClip sont exécutées
  5. Les actions de cadre des enfants MovieClips sont exécutées
  6. cas de type d'événement Event.EXIT_FRAME a envoyé
  7. événement de type d'événement Event.RENDER expédié

afin que vous puissiez écouter l'événement EXIT_FRAME, à quel point le script cadre aurait dû fonctionner et le var devrait être ensemble.

Source

+0

Hmm, êtes-vous sûr de # 2? Je sais pertinemment que les enfants sont instanciés immédiatement après l'instanciation du parent, et les constructeurs devraient être appelés à ce moment-là (ou ils ne seraient pas des constructeurs). Quoi qu'il en soit, j'ai besoin de créer le clip, en extraire quelques trucs et ensuite le détruire, donc je suppose que je vais devoir mettre le code init dans les constructeurs. –

+0

chose sûre, mais les enfants sont instanciés dans le cadre de la partie initialisation du parent MovieClip, donc dans le même "événement", plutôt que lorsque le cadre rend ou les actions de frame movieclip sont appelés etc – longstaff

+0

Ouais, mais l'initialisation de movieclips ne se produit pas à un point précis de la boucle de trame, il arrive juste quand vous les construisez (j'ai testé cela maintenant et j'ai mis mon code à travailler en le mettant dans le constructeur) –

0

Je ne pense pas que le calendrier des scripts d'image est vraiment au cœur de votre question. Dans le cas de vos extraits de code ci-dessus, vous entrez dans une question de classe par rapport à instance. Regardons cette ligne:

this["myCustomVar"] = "bla"; 

Là, vous avez défini une nouvelle variable appelée myCustomVar dans l'instance de scénario racine. Une instance est une seule chose qui existe individuellement et peut être personnalisée. Toutefois, la personnalisation d'une instance ne modifie PAS la classe qui l'a définie à l'origine. Pensez à une fabrique de widgets: si vous prenez un widget fini à la fin de la ligne d'assemblage et que vous le peignez en rouge, cela ne signifie pas que l'usine produira désormais des widgets rouges ... vous venez de modifier une instance de widget La fin de la ligne. Pour que votre usine produise des widgets rouges, vous devez modifier l'usine elle-même - ou la définition de classe. Donc, je suppose que vous avez une classe personnalisée écrite pour MyMovieClip? Sinon, vous auriez besoin de le faire dans MyMovieClip.as:

package 
{ 
    import flash.display.MovieClip; 

    public class MyMovieClip extends MovieClip 
    { 
     public var myCustomVar:String = ""; 

     public function MyMovieClip():void { 
      super(); 
     } 
    } 
} 

Une fois que vous avez modifié la définition de classe de l'objet d'inclure votre variable personnalisée, puis seront construits tous les nouveaux cas de cette catégorie à cette variable. J'espère que cela pourra aider.

+0

Merci d'avoir essayé d'aider, mais je suis tout à fait conscient des classes et des instances, ayant programmé depuis plus de 6 ans maintenant: P Le script de frame n'est pas exécuté sur le scénario racine , mais sur la timeline movieclip, donc 'this' fait référence à l'instance nouvellement créée. –