I den här snabba tipset lär du dig att konstruera en referens till en klass från en sträng och skapa sedan en instans av den klassen med hjälp av en inbyggd AS3-funktion som heter getDefinitionByName ()
. Du lär dig också de bästa metoderna för att använda detta i olika situationer.
getDefinitionByName ()
är mycket användbart om du behöver göra nya instanser av klasser genom att använda en Sträng
. Till exempel, om du hade sju olika plattor - var och en representerad av en klass som heter Tile1
, Tile2
, etc - och du behövde skapa en förekomst av varje, måste du skriva följande kod:
privat funktion 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 = new Tile6 (); var tile7: Tile7 = ny Tile7 (); stage.addChild (tile1); stage.addChild (tile2); stage.addChild (tile3); // Du får idén, det är väldigt lång tid!
getDefinitionByName ()
låter dig lösa detta problem!
Nu var koden ovan lite rotig och vi var tvungna att skriva många linjer bara för att göra några olika plattor. Så här kan vi nå samma mål med getDefinitionByName ()
:
privat 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 );
I rad 6, getDefinitionByName ()
returnerar en referens av klassen "Bricka
+ det nuvarande värdet av jag
i för-loop". Så när jag
är lika med 1, getDefinitionByName ("Tile" + i);
returnerar en referens till klassen Tile1
. Vi skapar sedan kakel och lägger den till scenen.
(Vi kan inte skriva var kakel: tileRef
därför att tileRef
hänvisar inte till någonting vid kompileringstid; om du försöker får du ett kompilatorfel.)
Men när du kör denna kod kommer det inte fungera! Du får en variabeln är odefinierad
felmeddelande, i de flesta fall, eftersom "Tile1" kanske inte är tillräckligt med information för att Flash ska kunna hitta klassen. Låt oss titta på några lösningar.
Det finns några vanliga metoder för att lösa problemet med variabeln är odefinierad
fel du får när du kör koden ovan, och jag ska lära dig vad de är. Jag skulle också vilja ge krediter till Gert-Jan van der Well av Floorplanner Tech Blog för denna blogginlägg.
Här är några av de metoder du kan använda:
I den här metoden skapar du bara några dummyvariabler med referenser till de klasser du vill referera till getDefinitionByName ()
senare:
privat var dummyTile1: Tile1; privat var dummyTile2: Tile2; // etc privat funktion createTiles (): void // Skapa kakel
Det här fungerar, men det är väldigt fult. Om du har kakelklasserna i ett annat paket, måste du också importera dem!
Det här är ungefär som Dummy Variable-metoden, men du stör inte med att konfigurera en dummyvariabel för varje klass. du släpper bara några få uttryckliga referenser till klasserna själva:
Tile1, Tile2, Tile3, Tile4, Tile5, Tile6, Tile7; // etc privat funktion createTiles (): void // Skapa kakel
Nu kan det se bättre ut, men det faktum att du måste uppdatera den här listan varje gång du gör en ny Bricka
resterna.
En annan metod, som är den finaste (om du har klasser i ett annat paket) är att inkludera hela sökvägen i din sträng:
// Låt oss säga att mina plattor är alla i paketet 'project.Tiles' privata 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 );
Mycket tydligare! Detta fungerar dock bara om klasserna finns i ett separat paket från den här klassen.
Om plattorna hålls i en SWC kan du göra det mycket enklare, utan att behöva använda några import- eller dummyvariabler. Jag skulle vilja ge krediter till Dreaming in Flash för den här blogginlägget som förklarade för mig hur man använder den här metoden:
inkludera-bibliotek PATH_TO_SWC
PATH_TO_SWC måste vara den absoluta sökvägen och inte den relativa sökvägen!
Bra, alla dessa metoder har nu förklarats. Tyvärr finns det inga fantastiska magiska metoder att använda om du har alla plattor i samma paket som alla andra AS-filer. Jag rekommenderar att du gör ett nytt paket som heter plattor
eller något om du vill använda de goda metoderna!
Tja, idag borde du ha lärt dig hur du ska använda getDefinitionByName ()
och de bästa metoderna för att använda den. Jag hoppas att detta kommer att hjälpa dig i alla framtida projekt och om du har några frågor, lämna dem i kommentarfältet nedan!