Rask Tips Forstå getDefinitionByName ()

I denne Quick Tip lærer du hvordan du bygger en referanse til en klasse fra en streng, og deretter oppretter du en forekomst av den klassen, ved hjelp av en innebygd AS3-funksjon kalt getDefinitionByName (). Du vil også lære de beste metodene for å bruke dette i forskjellige situasjoner.


Hvorfor er getDefinitionByName () Nyttig?

getDefinitionByName () er veldig nyttig hvis du trenger å lage nye forekomster av klasser ved å bruke en string. For eksempel, hvis du hadde syv forskjellige fliser - hver representert av en klasse som heter flis1, Tile2, etc - og du måtte lage en forekomst av hver, må du skrive følgende kode:

 privat funksjon createTiles (): void var tile1: Tile1 = new Tile1 (); var tile2: Tile2 = ny Tile2 (); var tile3: Tile3 = new Tile3 (); var tile4: Tile4 = ny Tile4 (); var tile5: Tile5 = ny Tile5 (); var tile6: Tile6 = ny Tile6 (); var tile7: Tile7 = ny Tile7 (); stage.addChild (tile1); stage.addChild (tile2); stage.addChild (tile3); // Du får ideen, det er veldig lang! 

getDefinitionByName () lar deg løse dette problemet!


Hvordan bruke det

Nå var koden ovenfor litt rotete, og vi måtte skrive mange linjer bare for å lage noen forskjellige fliser. Slik kan vi nå det samme målet med getDefinitionByName ():

 privat funksjon 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 );  

I linje 6, getDefinitionByName () returnerer en referanse til klassen kalt "Tile + nåværende verdi av Jeg i forløp". Så når Jeg er lik 1, getDefinitionByName ("Tile" + i); returnerer en referanse til klassen flis1. Vi lager deretter flisen og legger den til scenen.

(Vi kan ikke skrive var fliser: tileRef fordi tileRef refererer ikke til noe på kompileringstidspunktet; hvis du prøver, får du en kompilatorfeil.)

Men når du kjører denne koden, vil det ikke fungere! Du får en variabel er udefinert Feilmelding, i de fleste tilfeller, fordi "Tile1" kanskje ikke er nok informasjon for Flash for å finne klassen. La oss se på noen løsninger.


Få det til å fungere

Det er noen vanlige bruksmetoder for å løse problemet med variabel er udefinert Feil du får når du kjører koden ovenfor, og jeg skal lære deg hva de er. Jeg vil også gi kreditt til Gert-Jan van der Well av Floorplanner Tech Blog for dette blogginnlegget.

Her er noen av metodene du kan bruke:

  • Bruk en Dummy-variabel
  • Bruk kort notering av Klassenavn
  • Ta med hele banen i Strenge
  • Ta med klassens SWC i prosjektet ditt

Bruke en Dummy-variabel

I denne metoden oppretter du bare noen dummyvariabler med referanser til klassene du vil henvise til getDefinitionByName () seinere:

 private var dummyTile1: Tile1; private var dummyTile2: Tile2; // etc privat funksjon createTiles (): void // Opprett fliser

Dette fungerer, men det er veldig styggt. Hvis du har fliseklassene i en annen pakke, må du også importere dem!

Kort notasjon

Dette er mye som Dummy Variable-metoden, men du bryr deg ikke om å sette opp en dummy-variabel for hver klasse; du slipper bare noen få eksplisitte referanser til klassene selv:

 Flis1, Tile2, Tile3, Tile4, Tile5, Tile6, Tile7; // etc privat funksjon createTiles (): void // Opprett fliser

Nå kan dette se bedre ut, men det faktum at du må oppdatere denne listen hver gang du lager en ny Tile rester.

Inkludert fullpath-navnet

En annen metode, som er den fineste (hvis du har klasser i en annen pakke), er å inkludere hele stienavnet i din streng:

 // La oss si at mine fliser er alle i pakken 'project.Tiles' private funksjon 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 );  

Mye tidligere! Dette fungerer imidlertid bare hvis klassene er i en egen pakke fra denne klassen.

Bruke en SWC

Hvis flisene holdes i en SWC, kan du gjøre dette mye lettere, uten å måtte bruke noen import- eller dummyvariabler. Jeg vil gjerne gi kreditt til v0id fra Dreaming in Flash for dette blogginnlegget som forklarte meg hvordan du bruker denne metoden:

  • I prosjektegenskapene velger du "ActionScript Compiler"
  • Legg til følgende i feltet "Ekstra kompiler argumenter": inkludere-biblioteker PATH_TO_SWC

PATH_TO_SWC må være den absolutte banen og ikke den relative banen!

Flott, alle disse metodene er nå blitt forklart. Dessverre er det ingen fantastiske magiske metoder å bruke hvis du har alle fliser i samme pakke som alle andre AS-filer. Jeg vil anbefale deg å ringe en ny pakke fliser eller noe hvis du vil bruke de gode metodene!


Konklusjon

Vel, i dag burde du ha lært å bruke getDefinitionByName () og de beste metodene for å bruke den. Jeg håper dette vil hjelpe deg i fremtidige prosjekter, og hvis du har noen spørsmål, la dem være i kommentarfeltet nedenfor!