Sfat rapid Înțelegerea getDefinitionByName ()

În acest sfat rapid, veți învăța cum să construiți o referință la o clasă dintr-un String și apoi să creați o instanță a acelei clase utilizând o funcție AS3 încorporată numită getDefinitionByName (). Veți învăța, de asemenea, cele mai bune metode pentru utilizarea în situații diferite.


De ce este getDefinitionByName () Util?

getDefinitionByName () este foarte util dacă aveți nevoie să creați noi instanțe de clase utilizând un a Şir. De exemplu, dacă ați avea șapte plăci diferite - fiecare reprezentată de o clasă numită Tile1, Tile2, etc - și aveați nevoie să creați o instanță a fiecăruia, va trebui să scrieți următorul cod:

 funcția privată createTiles (): void var tile1: Tile1 = noul Tile1 (); var tile2: Tile2 = Tile2 noi (); var tile3: Tile3 = Tile3 noi (); var tile4: Tile4 = Tile4 noi (); var tile5: Tile5 = Tile noi5 (); var tile6: Tile6 = Tile noi6 (); var tile7: Tile7 = Tile7 noi (); stage.addChild (țiglă1); etapa.addChild (tigla2); stage.addChild (țiglă3); // Ai idee, este foarte lungă! 

getDefinitionByName () vă permite să rezolvați această problemă!


Cum să-l folosească

Acum, codul de mai sus a fost un pic cam murdar și a trebuit să tastăm multe linii doar pentru a face câteva plăci diferite. Acesta este modul în care am putea atinge același scop folosind getDefinitionByName ():

 funcția privată createTiles (): void pentru (var i: int = 1; i < 8; i++ )  var tileRef:Class = getDefinitionByName( "Tile" + i ) as Class; var tile:Sprite = new tileRef(); stage.addChild( tile );  

În linia 6, getDefinitionByName () returnează o referință a clasei numită "Ţiglă + valoarea curentă a eu în for-loop". Deci când eu este egal cu 1, getDefinitionByName ("Placă" + i); returnează o referință la clasă Tile1. Apoi creăm placa și o adăugăm pe scenă.

(Nu putem scrie var tile: tileRef deoarece tileRef nu se referă la nimic în timpul compilării; dacă încercați, veți obține o eroare de compilator.)

Cu toate acestea, când executați acest cod, acesta nu va funcționa! Veți obține o variabila este nedefinită mesaj de eroare, în cele mai multe cazuri, deoarece "Tile1" ar putea să nu fie suficientă informație pentru Flash pentru a găsi clasa. Să ne uităm la unele soluții.


Fă-o să mearga

Există câteva metode utilizate în mod obișnuit pentru a rezolva problema variabila este nedefinită veți avea eroare atunci când executați codul de mai sus și vă voi învăța cum sunt. Aș dori, de asemenea, să acord credit lui Gert-Jan van der Well pentru Floorplanner Tech Blog pentru acest post pe blog.

Iată câteva dintre metodele pe care le puteți utiliza:

  • Utilizați o variabilă Dummy
  • Folosiți notația scurtă a clasei
  • Includeți calea completă din String
  • Includeți SWC-ul clasei în proiectul dvs.

Folosind o variabilă dummy

În această metodă, creați doar câteva variabile minuțioase cu referințe la clasele cu care doriți să faceți referire getDefinitionByName () mai tarziu:

 privat var dummyTile1: Tile1; privat var dummyTile2: Tile2; // etc funcția privată createTiles (): void // Crearea dalelor

Acest lucru funcționează, dar este foarte urât. Dacă aveți clasele Tile într-un alt pachet, ar trebui să le importați!

Notă scurtă

Acest lucru este asemănător metodei variabile Dummy, dar nu vă deranjează să configurați o variabilă inactivă pentru fiecare clasă; doar dați câteva referințe explicite la clasele în sine:

 Tile1; Tile2, Tile3, Tile4, Tile5, Tile6; Tile7; // etc funcția privată createTiles (): void // Crearea dalelor

Acum, acest lucru ar putea părea mai curat, dar faptul că va trebui să actualizați această listă de fiecare dată când faceți un nou Ţiglă rămășițe.

Inclusiv numele căii complete

O altă metodă, care este cea mai tidică (dacă aveți clase într-un alt pachet) este să includeți numele căii complete în String-ul dvs.:

 // Să spunem că piesele mele sunt toate în pachetul "project.Tiles 'funcția privată createTiles (): void pentru (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 );  

Mult mai tare! Cu toate acestea, aceasta funcționează numai dacă clasele se află într-un pachet separat de această clasă.

Folosind un SWC

Dacă plăcile sunt ținute într-un SWC, puteți face acest lucru mult mai ușor, fără a fi nevoie să utilizați importuri sau variabile falsificate. Aș dori să acord credit pentru v0id de la Dreaming în Flash pentru postul de blog care mi-a explicat cum să folosesc această metodă:

  • În proprietățile proiectului alegeți "ActionScript Compiler"
  • În câmpul "Argumente suplimentare pentru compilatoare", adăugați următoarele: include-biblioteci PATH_TO_SWC

PATH_TO_SWC trebuie să fie calea absolută și nu calea relativă!

Mare, toate aceste metode au fost acum explicate. Din păcate, nu există metode magice fantastice de folosit dacă aveți toate plăcile din același pachet ca toate celelalte fișiere AS. Aș recomanda să faceți un nou pachet numit dale sau ceva dacă doriți să utilizați metodele bune!


Concluzie

Ei bine, astăzi ar fi trebuit să învățați cum să utilizați getDefinitionByName () și cele mai bune metode de utilizare a acesteia. Sper că acest lucru vă va ajuta în orice proiecte viitoare și dacă aveți întrebări, lăsați-i în secțiunea de comentarii de mai jos!

Cod