2008-11-18 7 views
0

Est-il possible d'obtenir une liste de toutes les instances avec un nom dans une animation flash en utilisant actionscript 2. Comme un tableau contenant toutes les zones de texte nommées, ou toutes les occurrences de MovieClip, etc. pour obtenir ceci afin que le concepteur puisse ajouter ou supprimer des zones de texte etc. et l'actionscript peut dynamiquement les trouver et obtenir les textes d'une source de données séparée.Récupère toutes les instances nommées dans un film flash

Je suppose que ce que je veux, c'est quelque chose comme un arbre DOM ou encore mieux quelque chose comme comment getElementByName() fonctionne en JavaScript. Et allso obtenir la valeur de chaîne du nom de l'instance afin que je puisse trouver sa valeur de texte dans un fichier XML. Supposons que le concepteur ajoute une nouvelle zone de texte avec le nom "copyright" et mon code devrait (sans avoir à modifier le script) trouver les données avec l'ID "copyright" dans un fichier XML s'il y est, et ajoutez la valeur à la zone de texte.

+0

Je ne trouve toujours rien, au moins cette question est maintenant le meilleur résultat sur une recherche google pour "obtenir toutes les instances flash", etc –

Répondre

2

@Stein Gauslaa Strindhaug

Ceci est assez rude, mais il devrait faire l'affaire!

private function traceAllChildren(rootContainer:DisplayObjectContainer):void { 
    for(var i=0; i < rootContainer.numChildren; i++) { 
     var item:* = rootContainer.getChildAt(i); 
     try { 
      traceAllChildren(item); 
     } catch (e:Error) { 
      trace(e.toString()); 
     } 
     trace(item.toString()); 
     // This is the block where you can affect 
     // an 'item' depending on it's type, name, etc.. 
     // eg: 
     //  if (item.toString() == '[object TextField]') { 
     //   item.text = "The text I want to insert"; 
     //  } 
     // or 
     //  if (item.name == myTextFieldNameVar) { 
     //   item.text = "The text I want to insert"; 
     //  } 
    } 
} 

Ensuite, appelez-le comme suit: traceAllChildren (ce) ou traceAllChildren (myParentMovieClip). J'espère que cela aide, bonne chance!

+0

Merci! Cela fonctionne bien. Peut-être un peu "sale" pour essayer d'analyser tous les éléments, mais je n'ai pas remarqué de lenteur. –

0

Cela fait longtemps que je n'ai pas fait de codage AS2, mais peut-être que vous pourriez utiliser une combinaison de MovieClip.getInstanceAtDepth() et this.getNextHighestDepth() pour trouver la plus grande profondeur dans votre film puis retracer chaque profondeur jusqu'à ce que vous trouvez un getInstanceAtDepth() correspondant au clip que vous voulez remplir avec de nouvelles données.

J'ai également remarqué cet exemple de code dans la documentation AS2.

Le code suivant présente la profondeur de toutes les instances de clip sur la scène:

for (var i in this) { 
    if (typeof (this[i]) == "movieclip") { 
    trace("movie clip '"+this[i]._name+"' is at depth "+this[i].getDepth()); 
    } 
} 

PS: Je sais que vous ne voulez probablement pas d'entendre cela, mais en AS3 c'est un jeu d'enfant que vous pouvez simplement itérer à travers this.children!

+0

Les éléments placés au moment de l'auteur sont affectés des profondeurs négatives, et il n'y a aucun moyen de obtenir la profondeur minimale. Donc, pour être sûr de parcourir tout le contenu, vous devez passer de getNextHighestDepth() à -MAXINT. – fenomas

+0

J'ai réussi à convertir la plupart de mon code en AS3, auriez-vous besoin d'expliquer comment faire cela dans AS3? –

1

Réponse courte: il n'y a pas de façon "intégrée" de le faire. Vous pourriez essayer de récupérer des fonctionnalités similaires à getElementByName(), mais il faudrait commencer par _root et parcourir votre contenu - et à proprement parler, un clip commence avec des références à ses enfants, mais ils pourraient être supprimés à l'exécution, donc cela pourrait échouer. Cela dit, il s'agit d'un problème commun et il existe de nombreuses approches à ce sujet. Une chose que vous pourriez trouver plus utile est de créer un composant personnalisé attaché à une classe personnalisée - par exemple, "TextPlaceholder", et demandez à votre concepteur de mettre des copies de celui-ci où ils veulent du texte dynamique. Ensuite, au moment de l'exécution, ce composant pouvait examiner sa propriété _name ou d'autres paramètres de composants personnalisés et, sur la base de ceux-ci, il pouvait créer un champ de texte de taille, de contenu approprié, etc. C'est juste une façon de l'aborder.

Questions connexes