Petite astuce Comprendre getDefinitionByName ()

Dans cette astuce, vous apprendrez à construire une référence à une classe à partir d'une chaîne, puis à créer une instance de cette classe, à l'aide d'une fonction AS3 intégrée appelée getDefinitionByName (). Vous apprendrez également les meilleures méthodes pour l'utiliser dans différentes situations..


Pourquoi getDefinitionByName () est-il utile??

getDefinitionByName () est très utile si vous devez créer de nouvelles instances de classes en utilisant un Chaîne. Par exemple, si vous avez sept tuiles différentes - chacune représentée par une classe appelée Tuile1, Tuile2, etc - et vous deviez créer une instance de chacun, vous deviez écrire le code suivant:

 fonction privée createTiles (): void var tile1: Tile1 = new Tile1 (); var tile2: Tile2 = new Tile2 (); var tile3: Tile3 = new Tile3 (); var tile4: Tile4 = new Tile4 (); var tile5: Tile5 = new Tile5 (); var tile6: Tile6 = new Tile6 (); var tile7: Tile7 = new Tile7 (); stage.addChild (tile1); stage.addChild (tile2); stage.addChild (tile3); // Vous avez l'idée, c'est très long! 

getDefinitionByName () vous permet de résoudre ce problème!


Comment l'utiliser

Maintenant, le code ci-dessus était un peu brouillon et nous avons dû taper beaucoup de lignes pour créer quelques tuiles différentes. C’est ainsi que nous pourrions atteindre le même objectif en utilisant getDefinitionByName ():

 fonction privée createTiles (): void for (var i: int = 1; i < 8; i++ )  var tileRef:Class = getDefinitionByName( "Tile" + i ) as Class; var tile:Sprite = new tileRef(); stage.addChild( tile );  

Dans la ligne 6, getDefinitionByName () retourne une référence de la classe appelée "Tuile + la valeur actuelle de je dans la boucle". Donc quand je est égal à 1, getDefinitionByName ("Tile" + i); renvoie une référence à la classe Tuile1. Nous créons ensuite la tuile et l'ajoutons à la scène.

(Nous ne pouvons pas écrire carrelage var: tileRef parce que tileRef ne fait référence à rien au moment de la compilation; si vous essayez, vous obtiendrez une erreur de compilation.)

Cependant, lorsque vous exécutez ce code, cela ne fonctionnera pas! Vous aurez un variable est indéfinie message d'erreur, dans la plupart des cas, car "Tile1" peut ne pas être suffisant pour que Flash trouve la classe. Regardons quelques solutions de contournement.


Fais-le fonctionner

Il existe quelques méthodes couramment utilisées pour résoudre le problème de la variable est indéfinie erreur que vous obtiendrez lorsque vous exécuterez le code ci-dessus, et je vais vous apprendre ce qu’ils sont. Je tiens également à remercier Gert-Jan van der Well du blog Tech Floorplanner pour cet article de blog.

Voici certaines des méthodes que vous pouvez utiliser:

  • Utiliser une variable factice
  • Utilisez la notation courte du nom de classe
  • Inclure le chemin complet dans la chaîne
  • Inclure le SWC de la classe dans votre projet

Utiliser une variable factice

Dans cette méthode, vous créez simplement des variables nominales avec des références aux classes auxquelles vous souhaitez faire référence. getDefinitionByName () plus tard:

 var privé dummyTile1: Tile1; var privé dummyTile2: Tile2; // etc function privée createTiles (): void // Créer les tuiles

Cela fonctionne, mais c'est très moche. Si vous avez les classes de tuiles dans un autre package, vous devrez également les importer!

Notation courte

Cela ressemble beaucoup à la méthode Dummy Variable, mais vous ne vous occupez pas de la configuration d'une variable factice pour chaque classe; vous venez de déposer quelques références explicites aux classes elles-mêmes:

 Mosaïque1; Mosaïque2; Mosaïque3; Mosaïque4; Mosaïque5; Mosaïque6; Mosaïque7; // etc function privée createTiles (): void // Créer les tuiles

Cela peut sembler plus simple, mais vous devrez mettre à jour cette liste à chaque fois que vous ferez un nouveau Tuile restes.

Y compris le nom de chemin complet

Une autre méthode, qui est la plus rapide (si vous avez des classes dans un autre paquet), consiste à inclure le nom du chemin complet dans votre chaîne:

 // Disons que mes tuiles sont toutes dans le paquet 'project.Tiles', fonction privée createTiles (): void pour (var i: int = 1; i < 8; i++ )  var tileRef:Class = getDefinitionByName( "project.Tiles.Tile" + i ) as Class; var tile:tileRef = new tileRef(); stage.addChild( tile );  

Beaucoup plus propre! Cependant, cela ne fonctionne que si les classes sont dans un package séparé de cette classe..

Utilisation d'un SWC

Si les tuiles sont conservées dans un fichier SWC, vous pouvez simplifier les choses beaucoup plus facilement sans avoir à utiliser d’importations ou de variables nominales. Je voudrais donner crédit à v0id de Dreaming in Flash pour cet article de blog qui m'a expliqué comment utiliser cette méthode:

  • Dans les propriétés du projet, choisissez "Compilateur ActionScript".
  • Dans le champ "Arguments supplémentaires du compilateur", ajoutez ce qui suit: bibliothèques d'inclusion PATH_TO_SWC

PATH_TO_SWC doit être le chemin absolu et non le chemin relatif!

Génial, toutes ces méthodes ont maintenant été expliquées. Malheureusement, il n’existe aucune méthode magique fantastique à utiliser si toutes les tuiles sont dans le même package que tous les autres fichiers AS. Je vous recommande de faire un nouveau paquet appelé Carrelage ou quelque chose si vous voulez utiliser les bonnes méthodes!


Conclusion

Eh bien, aujourd’hui, vous auriez dû apprendre à utiliser getDefinitionByName () et les meilleures méthodes d'utilisation. J'espère que cela vous aidera dans vos projets futurs et si vous avez des questions, laissez-les dans la section commentaires ci-dessous!