In deze Snelle tip leert u hoe u een verwijzing naar een klasse uit een tekenreeks construeert en vervolgens een instantie van die klasse maakt met behulp van een ingebouwde AS3-functie met de naam getDefinitionByName ()
. Je leert ook de beste methoden om dit in verschillende situaties te gebruiken.
getDefinitionByName ()
is erg handig als u nieuwe instanties van klassen wilt maken met behulp van a Draad
. Bijvoorbeeld, als u zeven verschillende tegels had - elk vertegenwoordigd door een klasse genaamd Tile1
, Tile2
, etc - en je moest een instantie van elk maken, je zou de volgende code moeten schrijven:
private function 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); // Je snapt het, het is erg lang!
getDefinitionByName ()
kunt u dit probleem oplossen!
Nu was de bovenstaande code een beetje rommelig en moesten we veel regels typen om een paar verschillende tegels te maken. Dit is hoe we hetzelfde doel kunnen bereiken met getDefinitionByName ()
:
private function 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 );
In regel 6, getDefinitionByName ()
geeft een verwijzing terug van de klasse genaamd "Tegel
+ de huidige waarde van ik
in de for-loop". Dus wanneer ik
is gelijk aan 1, getDefinitionByName ("Tile" + i);
geeft een verwijzing naar de klasse Tile1
. We maken vervolgens de tegel en voegen deze toe aan het werkgebied.
(We kunnen niet schrijven var tile: tileRef
omdat tileRef
verwijst nergens naar tijdens compilatie; als je het probeert, krijg je een compileerfout.)
Wanneer u deze code uitvoert, zal deze echter niet werken! Je krijgt een variabele is undefined
foutmelding, in de meeste gevallen, omdat "Tile1" mogelijk niet voldoende informatie is voor Flash om de klasse te vinden. Laten we eens kijken naar een aantal oplossingen.
Er zijn een paar veelgebruikte methoden om het probleem van de variabele is undefined
fout die u krijgt als u de bovenstaande code uitvoert, en ik ga u leren wat ze zijn. Ik wil ook graag waardering uitspreken voor Gert-Jan van der Well van Floorplanner Tech Blog voor deze blogpost.
Hier zijn enkele van de methoden die u kunt gebruiken:
In deze methode maakt u gewoon enkele dummy-variabelen met verwijzingen naar de klassen waar u naar wilt verwijzen getDefinitionByName ()
later:
private var dummyTile1: Tile1; privé var dummyTile2: Tile2; // etc private function createTiles (): void // Create the tiles
Dit werkt, maar het is erg lelijk. Als u de Tile-klassen in een ander pakket hebt, moet u deze ook importeren!
Dit lijkt veel op de Dummy Variable-methode, maar u hoeft niet de moeite te nemen om voor elke klasse een dummy-variabele in te stellen; je laat gewoon een paar expliciete verwijzingen naar de klassen vallen:
Tile1, Tile2, Tile3, Tile4, Tile5, Tile6; Tile7; // etc private function createTiles (): void // Create the tiles
Dit ziet er misschien netter uit, maar het feit dat u deze lijst telkens moet bijwerken als u een nieuwe maakt Tegel
stoffelijk overschot.
Een andere methode, die het meest netjes is (als je klassen in een ander pakket hebt) is om de volledige padnaam in je string op te nemen:
// Laten we zeggen dat mijn tegels zich allemaal in het pakket bevinden 'project.Tiles' private function 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 );
Veel netter! Dit werkt echter alleen als de klassen zich in een apart pakket van deze klasse bevinden.
Als de tegels in een SWC worden gehouden, kunt u dit veel eenvoudiger maken, zonder invoer of dummyvariabelen te hoeven gebruiken. Ik zou graag de v0id van Dreaming in Flash willen vermelden voor deze blogpost die me uitlegde hoe deze methode te gebruiken:
include-libraries PATH_TO_SWC
De PATH_TO_SWC moet het absolute pad zijn en niet het relatieve pad!
Geweldig, al deze methoden zijn nu uitgelegd. Helaas zijn er geen fantastische magische methoden om te gebruiken als alle tegels in hetzelfde pakket zitten als alle andere AS-bestanden. Ik zou aanraden om een nieuw pakket te maken met de naam tegels
of zoiets als je de goede methoden wilt gebruiken!
Nou, vandaag had je moeten leren gebruiken getDefinitionByName ()
en de beste methoden om het te gebruiken. Ik hoop dat dit je zal helpen bij toekomstige projecten en als je vragen hebt, laat ze dan achter in de comments hieronder!