Schnelltipp getDefinitionByName () verstehen

In diesem Schnelltipp erfahren Sie, wie Sie aus einer Zeichenfolge einen Verweis auf eine Klasse erstellen und dann eine Instanz dieser Klasse erstellen, indem Sie eine eingebaute AS3-Funktion verwenden getDefinitionByName (). Sie lernen auch die besten Methoden, um dies in verschiedenen Situationen anzuwenden.


Warum ist getDefinitionByName () nützlich??

getDefinitionByName () ist sehr nützlich, wenn Sie mithilfe von eine neue Instanz von Klassen erstellen müssen String. Wenn Sie zum Beispiel sieben verschiedene Kacheln hatten, die jeweils durch eine aufgerufene Klasse dargestellt werden Tile1, Tile2, etc - und Sie mussten jeweils eine Instanz erstellen, und Sie müssten folgenden Code schreiben:

 private Funktion 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); // Sie bekommen die Idee, es ist sehr langwierig! 

getDefinitionByName () ermöglicht es Ihnen, dieses Problem zu lösen!


Wie benutzt man es?

Der obige Code war etwas unordentlich und wir mussten viele Zeilen eingeben, um ein paar verschiedene Kacheln zu erstellen. So können wir das gleiche Ziel mit erreichen getDefinitionByName ():

 private Funktion 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 Zeile 6, getDefinitionByName () gibt eine Referenz der Klasse namens "Fliese + der aktuelle Wert von ich in der for-Schleife"Also, wann ich ist gleich 1, getDefinitionByName ("Tile" + i); gibt einen Verweis auf die Klasse zurück Tile1. Dann erstellen wir die Kachel und fügen sie der Bühne hinzu.

(Wir können nicht schreiben var tile: tileRef da tileRef bezieht sich nicht auf etwas zur Kompilierzeit; Wenn Sie es versuchen, erhalten Sie einen Compiler-Fehler.)

Wenn Sie diesen Code ausführen, funktioniert er jedoch nicht! Du bekommst eine Variable ist undefiniert In den meisten Fällen wird eine Fehlermeldung angezeigt, da "Tile1" für Flash möglicherweise nicht ausreicht, um die Klasse zu finden. Sehen wir uns einige Problemumgehungen an.


Bring es zum Laufen

Es gibt einige häufig verwendete Methoden, um das Problem der zu lösen Variable ist undefiniert Fehler, den Sie erhalten, wenn Sie den obigen Code ausführen, und ich werde Ihnen zeigen, was sie sind. Ich möchte auch Gert-Jan van der Well vom Floorplanner Tech Blog für diesen Blogbeitrag danken.

Hier sind einige der Methoden, die Sie verwenden können:

  • Verwenden Sie eine Dummy-Variable
  • Verwenden Sie eine kurze Schreibweise des Klassennamens
  • Fügen Sie den vollständigen Pfad in die Zeichenfolge ein
  • Binden Sie die SWC der Klasse in Ihr Projekt ein

Verwenden einer Dummy-Variable

In dieser Methode erstellen Sie einfach einige Dummy-Variablen mit Verweisen auf die Klassen, auf die Sie verweisen möchten getDefinitionByName () später:

 private var dummyTile1: Tile1; private var dummyTile2: Tile2; // etc private function createTiles (): void // Kacheln erstellen

Das funktioniert, ist aber sehr hässlich. Wenn Sie die Tile-Klassen in einem anderen Paket haben, müssen Sie sie auch importieren!

Kurze Notation

Dies ist der Dummy-Variablen-Methode sehr ähnlich, Sie müssen jedoch nicht für jede Klasse eine Dummy-Variable einrichten. Sie lassen nur einige explizite Verweise auf die Klassen selbst fallen:

 Tile1; Tile2; Tile3; Tile4; Tile5; Tile6; Tile7; // etc private function createTiles (): void // Kacheln erstellen

Nun, dies sieht vielleicht klüger aus, aber die Tatsache, dass Sie diese Liste jedes Mal aktualisieren müssen, wenn Sie eine neue erstellen Fliese Überreste.

Einschließlich des vollständigen Pfadnamens

Eine andere Methode, die am besten geeignet ist (wenn Sie Klassen in einem anderen Paket haben), besteht darin, den vollständigen Pfadnamen in Ihren String aufzunehmen:

 // Nehmen wir an, meine Kacheln sind alle im Paket 'project.Tiles' enthalten. Private Funktion 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 );  

Viel aufgeräumter! Dies funktioniert jedoch nur, wenn sich die Klassen in einem separaten Paket von dieser Klasse befinden.

Verwendung eines SWC

Wenn sich die Kacheln in einem SWC befinden, können Sie dies wesentlich einfacher machen, ohne Import- oder Dummy-Variablen verwenden zu müssen. Ich möchte v0id von Dreaming in Flash für diesen Blogbeitrag, der mir erklärt hat, wie man diese Methode verwendet, meinen Dank aussprechen:

  • Wählen Sie in den Projekteigenschaften "ActionScript Compiler" aus.
  • Fügen Sie im Feld "Zusätzliche Compilerargumente" Folgendes hinzu: Include-Bibliotheken PATH_TO_SWC

PATH_TO_SWC muss der absolute Pfad und nicht der relative Pfad sein!

Toll, alle diese Methoden wurden nun erklärt. Leider gibt es keine fantastischen magischen Methoden, wenn Sie alle Kacheln im selben Paket wie alle anderen AS-Dateien haben. Ich würde empfehlen, dass Sie ein neues Paket erstellen Fliesen oder etwas, wenn Sie die guten Methoden verwenden möchten!


Fazit

Nun, heute hätten Sie lernen sollen, wie man es benutzt getDefinitionByName () und die besten Methoden zur Verwendung. Ich hoffe, dass dies Ihnen bei zukünftigen Projekten helfen wird. Falls Sie Fragen haben, lassen Sie sie in den Kommentaren unten!