Snelle tip GetDefinitionByName () begrijpen

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.


Waarom is getDefinitionByName () nuttig?

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!


Hoe te gebruiken

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.


Zorg dat het werkt

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:

  • Gebruik een dummy-variabele
  • Gebruik een korte notatie van de naam van de klas
  • Neem het volledige pad op in de string
  • Neem de SWC van de klas op in uw project

Een dummy-variabele 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!

Korte notatie

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.

Inclusief de volledige padnaam

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.

Een SWC gebruiken

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:

  • Kies "ActionScript Compiler" in de projecteigenschappen
  • Voeg het volgende toe aan het veld 'Aanvullende compileerderargumenten': 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!


Conclusie

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!