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.
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!
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.
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:
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!
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.
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.
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:
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!
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!