Consejo rápido Entender getDefinitionByName ()

En esta Sugerencia rápida, aprenderá cómo construir una referencia a una clase desde una Cadena, y luego creará una instancia de esa clase, utilizando una función AS3 incorporada llamada getDefinitionByName (). También aprenderás los mejores métodos para usar esto en diferentes situaciones..


¿Por qué es getDefinitionByName () útil?

getDefinitionByName () es muy útil si necesita crear nuevas instancias de clases usando una Cuerda. Por ejemplo, si tiene siete mosaicos diferentes, cada uno representado por una clase llamada Tile1, Tile2, etc. - y necesitaba crear una instancia de cada uno, tendría que escribir el siguiente código:

 función privada 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 = nuevo Tile7 (); stage.addChild (tile1); stage.addChild (tile2); stage.addChild (tile3); // ¡Entiendes la idea, es muy larga! 

getDefinitionByName () te permite resolver este problema!


Cómo usarlo

Ahora, el código anterior estaba un poco desordenado y tuvimos que escribir muchas líneas solo para hacer unas cuantas fichas diferentes. Así es como podríamos lograr el mismo objetivo usando getDefinitionByName ():

 función privada 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 );  

En linea 6, getDefinitionByName () devuelve una referencia de la clase llamada "Azulejo + el valor actual de yo en el bucle for". Así que cuando yo es igual a 1, getDefinitionByName ("Tile" + i); devuelve una referencia a la clase Tile1. Luego creamos la baldosa y la agregamos al escenario..

(No podemos escribir azulejo var: tileRef porque tileRef no se refiere a nada en tiempo de compilación; Si lo intentas, obtendrás un error del compilador.)

Sin embargo, cuando ejecute este código, ¡no funcionará! Obtendrá un la variable no está definida mensaje de error, en la mayoría de los casos, porque "Tile1" podría no ser suficiente información para que Flash encuentre la clase. Echemos un vistazo a algunas soluciones.


Hazlo funcionar

Existen algunos métodos de uso común para resolver el problema de la la variable no está definida error que obtendrás cuando ejecutes el código anterior, y te voy a enseñar cuáles son. También me gustaría dar crédito a Gert-Jan van der Well del Blog de Floorplanner Tech por esta publicación de blog.

Estos son algunos de los métodos que puede utilizar:

  • Usa una variable ficticia
  • Use notación corta del nombre de la clase
  • Incluir el camino completo en la cadena
  • Incluye el SWC de la clase en tu proyecto.

Usando una variable ficticia

En este método, solo creará algunas variables ficticias con referencias a las clases a las que desea referirse getDefinitionByName () luego:

 private var dummyTile1: Tile1; privado var dummyTile2: Tile2; // etc Función privada createTiles (): void // Crear los mosaicos

Esto funciona, pero es muy feo. Si tiene las clases Tile en otro paquete, también tendría que importarlas!

Notación corta

Esto es muy parecido al método de variable ficticia, pero no se molesta en configurar una variable ficticia para cada clase; simplemente suelta algunas referencias explícitas a las clases en sí:

 Tile1; Tile2; Tile3; Tile4; Tile5; Tile6; Tile7; // etc Función privada createTiles (): void // Crear los mosaicos

Ahora, esto puede parecer más ordenado, pero el hecho de que tendrá que actualizar esta lista cada vez que realice una nueva Azulejo permanece.

Incluyendo el nombre completo de la ruta

Otro método, que es el más ordenado (si tiene clases en otro paquete) es incluir el nombre completo de la ruta en su String:

 // Digamos que mis Tiles están todos en el paquete 'project.Tiles' función privada createTiles (): void for (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 );  

¡Mucho más ordenado! Sin embargo, esto solo funciona si las clases están en un paquete separado de esta clase.

Usando un SWC

Si los azulejos se mantienen en un SWC, puede hacer esto mucho más fácil, sin necesidad de usar ninguna importación o variables ficticias. Me gustaría darle crédito a v0id de Dreaming in Flash por esta publicación del blog que me explicó cómo usar este método:

  • En las propiedades del proyecto, elija "Compilador de ActionScript"
  • En el campo "Argumentos de compilador adicionales", agregue lo siguiente: bibliotecas de inclusión PATH_TO_SWC

El PATH_TO_SWC debe ser la ruta absoluta y no la ruta relativa!

Genial, todos estos métodos ya han sido explicados. Desafortunadamente, no hay métodos mágicos fantásticos para usar si tienes todos los mosaicos en el mismo paquete que todos los demás archivos AS. Te recomendaría hacer un nuevo paquete llamado Azulejos O algo así si quieres usar los buenos métodos.!


Conclusión

Bueno, hoy deberías haber aprendido a usar getDefinitionByName () Y los mejores métodos de uso. Espero que esto le ayude en cualquier proyecto futuro y si tiene alguna pregunta, déjelo en la sección de comentarios a continuación.!