Suggerimento rapido Understanding getDefinitionByName ()

In questo suggerimento rapido, imparerai come costruire un riferimento a una classe da una stringa e quindi creare un'istanza di quella classe, utilizzando una funzione AS3 incorporata chiamata getDefinitionByName (). Imparerai anche i migliori metodi per usarlo in diverse situazioni.


Perché GetDefinitionByName () è utile?

getDefinitionByName () è molto utile se hai bisogno di creare nuove istanze di classi usando a Stringa. Ad esempio, se hai sette tessere diverse, ciascuna rappresentata da una classe chiamata Tile1, Tile2, ecc. e tu avevi bisogno di creare un'istanza di ciascuno, dovresti scrivere il seguente codice:

 funzione privata 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); // Hai un'idea, è molto lunga! 

getDefinitionByName () ti permette di risolvere questo problema!


Come usarlo

Ora, il codice sopra era un po 'disordinato e abbiamo dovuto scrivere molte righe solo per fare alcune tessere diverse. È così che potremmo raggiungere lo stesso obiettivo utilizzando getDefinitionByName ():

 funzione privata 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 );  

Nella riga 6, getDefinitionByName () restituisce un riferimento della classe chiamata "Piastrella + il valore corrente di io nel ciclo for". Cosi quando io è uguale a 1, getDefinitionByName ("Tile" + i); restituisce un riferimento alla classe Tile1. Creiamo quindi la tessera e la aggiungiamo allo stage.

(Non possiamo scrivere tessera var: tileRef perché tileRef non si riferisce a nulla al momento della compilazione; se ci provi, riceverai un errore del compilatore.)

Tuttavia, quando si esegue questo codice, non funzionerà! Otterrai un la variabile non è definita messaggio di errore, nella maggior parte dei casi, perché "Tile1" potrebbe non essere abbastanza informazioni per Flash per trovare la classe. Diamo un'occhiata ad alcuni soluzioni alternative.


Fallo funzionare

Ci sono alcuni metodi comunemente usati per risolvere il problema del la variabile non è definita errore che otterrai quando eseguirai il codice sopra, e ti insegnerò cosa sono. Mi piacerebbe anche dare credito a Gert-Jan van der Well di Floorplanner Tech Blog per questo post sul blog.

Ecco alcuni dei metodi che puoi utilizzare:

  • Usa una variabile fittizia
  • Utilizzare la notazione breve del nome della classe
  • Includi il percorso completo nella stringa
  • Includi l'SWC della classe nel tuo progetto

Utilizzando una variabile fittizia

In questo metodo, devi solo creare alcune variabili dummy con riferimenti alle classi con cui vuoi fare riferimento getDefinitionByName () dopo:

 private var dummyTile1: Tile1; private var dummyTile2: Tile2; // etc private function createTiles (): void // Crea le tessere

Funziona, ma è molto brutto. Se hai le classi Tile in un altro pacchetto, dovresti anche importarle!

Notazione breve

Questo è molto simile al metodo Dummy Variable, ma non ti preoccupare di impostare una variabile dummy per ogni classe; lasciate solo alcuni riferimenti espliciti alle classi stesse:

 Tile1; Tile2; Tile3; Tile4; Tile5; mattonelle6; Tile7; // etc private function createTiles (): void // Crea le tessere

Ora, questo può sembrare più ordinato, ma il fatto che dovrai aggiornare questa lista ogni volta che ne fai una nuova Piastrella resti.

Compreso il nome completo del percorso

Un altro metodo, che è il più teso (se si hanno classi in un altro pacchetto), deve includere il nome completo del percorso nella stringa:

 // Diciamo che le mie tessere sono tutte nella funzione privata 'project.Tiles' di create createiles (): 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 );  

Molto più ordinato! Tuttavia, questo funziona solo se le classi si trovano in un pacchetto separato da questa classe.

Utilizzando un SWC

Se le tessere sono conservate in un SWC, puoi renderlo molto più semplice, senza dover usare importazioni o variabili fittizie. Mi piacerebbe dare credito a v0id di Dreaming in Flash per questo post del blog che mi ha spiegato come utilizzare questo metodo:

  • Nelle proprietà del progetto scegli "Compilatore ActionScript"
  • Nel campo "Argomenti aggiuntivi del compilatore", aggiungere quanto segue: include-librerie PATH_TO_SWC

PATH_TO_SWC deve essere il percorso assoluto e non il percorso relativo!

Grande, tutti questi metodi sono stati ora spiegati. Sfortunatamente, non ci sono fantastici metodi magici da usare se si hanno tutti i tasselli nello stesso pacchetto di tutti gli altri file AS. Ti consiglierei di creare un nuovo pacchetto chiamato piastrelle o qualcosa del genere se vuoi usare i buoni metodi!


Conclusione

Bene, oggi avresti dovuto imparare a usare getDefinitionByName () e i migliori metodi per usarlo. Spero che questo ti possa aiutare in qualsiasi progetto futuro e se hai qualche domanda, lasciateli nella sezione commenti qui sotto!