* Ikke egentlig alt.
I AS2-dagene kan du komme deg og måtte skrive en importere
setning ved å bare bruke det fullt kvalifiserte klassenavnet i klassekroppen (for eksempel flash.display.Sprite
i motsetning til bare Sprite
). Mens du er velkommen til å bruke det fullt kvalifiserte klassenavnet når du skriver koden din, importere
uttalelser for hver klasse er nødvendig i AS3.
Så det er ikke mye behov for å skrive fullt kvalifiserte klassenavn, med mindre du kommer til å bruke to klasser som deler samme korte navn i samme klasse - kanskje hvis du bruker Flash Kamera
klassen sammen med et 3D-bibliotek Kamera
klasse.
Unntaket fra forrige regel er om klassen du bruker og klassen du skriver, er begge i samme pakke. Alle klasser i en pakke er implisitt tilgjengelige for hverandre uten en importere
uttalelse.
Det er fortsatt ikke en dårlig ide å skrive importere
uttalelse uansett, fordi:
Ved å notere all din import, oppretter du en slags manifest av hvilke andre klasser klassen din stoler på for å kunne gjøre jobben sin. Det kan virke som en triviell ting, men denne informasjonen kan faktisk være ganske nyttig. Vurder følgende klasse ***:
pakke com.activetuts import com.activetuts.SuperTrace; importer com.activetuts.ActiveTween; offentlig klasse QuickTip offentlig funksjon QuickTip var sporer: SuperTrace = ny SuperTrace (); tracer.log ("Quick Tip"); var tween: ActiveTween = new ActiveTween (); tween.go ();
*** Forhåpentligvis er det åpenbart at denne klassen er illustrerende, ikke funksjonell.
Hvis du bruker dette Raskt tips
klasse, vil Flash automatisk sørge for at SuperTrace
og ActiveTween
klasser er også samlet i den resulterende SWF, fordi du brukte Raskt tips
, og Raskt tips
krever disse klassene.
Enkelt nok, men vurder nå mer realistiske klasser som bruker dusinvis av andre klasser. Hvis du trenger å vite hvilke klasser som er i bruk, en rask titt på importere
seksjonen kan gi deg en anstendig idé. Det er ikke uttømmende, og det er litt villedende selv, men du vil bli hardt presset for å finne noen som mener at selvdokumenterende kode er en dårlig ting.
blits
Klasser trenger å importere, men er ikke kompilertDet er en vanlig misforståelse rundt ideen om at bruk av mange klasser nødvendigvis betyr at filstørrelsen til SWF vil øke. Normalt er det sant. Men hvilken som helst klasse som starter med blits
er en levert av Flash Player, og vil ikke ha noen effekt på størrelsen på SWF. Byte-koden for, si, Sprite
er inneholdt i Flash Player, og du registrerer bare det faktum at du vil bruke en Sprite, ikke bunte den byte-koden inn i SWF-en. Dette er snakk om å ha Flash Player.
Jeg forventer ikke at du skal tro på dette. Jeg forventer at du skal være litt utrolig, og kreve bevis. Jeg ønsker deg velkommen til å bevise dette for deg selv, ved å følge disse trinnene:
I dokumentet klassen, skriv minimumet du trenger å faktisk definere det som en dokument klasse:
pakke import flash.display.Sprite; offentlig klasse Dokument utvider Sprite offentlig funksjon Dokument ()
Rediger din dokument klasse å bruke en haug med blits
klasser. For eksempel:
pakke import flash.display. *; importer flash.media. *; importer flash.net. *; importer flash.text. *; offentlig klasse Dokument utvider MovieClip offentlig funksjon Dokument () var l: Loader = ny Loader (); l.load (ny URLRequest ("someasset.swf")); var tf: TextField = nytt TextField (); var format: TextFormat = nytt TextFormat ("Verdana"); format.align = TextFormatAlign.CENTER; tf.defaultTextFormat = format; var v: Video = ny video (); var s: Lyd = nytt lyd (); Var kanal: SoundChannel = s.play ();
Vi bruker ganske mange klasser, som selv innlemmer enda flere klasser. Alle disse klassene er imidlertid blits
klasser.
Filmklipp
(som utvider en hel haug med andre klasser), loader
, URLRequest
, Tekstfelt
, tekstformat
, TextFormatAlign
, video
, Lyd
, og SoundChannel
. Det er mye funksjonalitet for 242 byte.I Utdata-panelet ser du noe som følger (hvis du brukte den ovenfor angitte koden ordentlig, ser du også lyd- og lastfeil, men de er ikke viktige):
flash-test.swf Movie Report ---------------------------- Ramme # Ramme Byte Total Bytes Scene ------- - ---------- ----------- ----- 1 598 598 Scene 1 (AS 3.0 Klasser Eksporter ramme) Sceneform Bytes Tekstbyte ActionScript Bytes ----- - ----------- ---------- ------------------ Scene 1 0 0 546 ActionScript Bytes Beliggenhet - ----------------- -------- 546 Scene 1: Ramme 1: Dokument
Denne testen skal illustrere at selv om vi har brukt mange Flash-gitt klasser, er den resulterende størrelsen på vår SWF relativt liten. Beviset kommer med størrelsesrapporten, men vi ser ingen oppføringer for noen av de innebygde klassene. Vi ser vår Dokument
klasse men ingen andre klasser, og den ene klassen er ansvarlig for alle ActionScript bytes.
Hvis dette ikke er nok bevis for deg, kan du ikke utvide eksperimentet. Du kan legge til enda flere Flash-gitt klasser, mens du måler økningen i størrelsen på SWF som fortsatt bare er et spørsmål om bytes. Du kan inkludere klasser av dine egne, og sørg for at de vises i klasselisten, og også påvirker størrelsen på SWF på en mer åpenbar måte. For eksempel laget jeg dette enkle Test
klasse:
pakke public class Test public function Test () trace ("TEST");
Inkludert denne enkle 7-linjesklassen, som ikke bruker andre klasser selv, støtte min test SWF til 717 byte, en økning på 121 bytes. Denne økningen er halvparten av økningen vi så da vi tilføyde alle disse blits
klasser; Byte-til-funksjonalitetsforholdet skal indikere at blits
klasser er ikke samlet i SWF.
Vær også oppmerksom på at du vil se en ekstra oppføring i størrelsesrapporten for den ekstra klassen; noe sånt som dette:
flash-test.swf Movie Report ---------------------------- Ramme # Ramme Byte Total Bytes Scene ------- - ---------- ----------- ----- 1 719 719 Scene 1 (AS 3.0 Klasser Eksporter Frame) Sceneform Bytes Tekstbyte ActionScript Bytes ----- - ----------- ---------- ------------------ Scene 1 0 0 673 ActionScript Bytes Beliggenhet - ----------------- -------- 179 Scene 1: Ramme 1: Test 494 Scene 1: Ramme 1: Dokument
Historienes moral: vær så snill å bruke så mange blits
klasser som du vil ****. De vil ikke påvirke størrelsen på SWF (selv om koden som bruker disse klassene vil selvsagt)
**** Husk at komponenter og Flex-klasser er ikke levert av Flash Player. Disse klassene ser ut til å være integrert, men hvis pakken ikke starter med blits
, da er den ikke gitt av spilleren.
Jeg beklager den dobbelte negative *****, men dette er en annen vanlig misforståelse som jeg ønsker å rydde opp.
Først en rask definisjon. EN wildcard import er en som ser slik ut:
importer flash.display. *;
Dette gjør at alle klassene er tilgjengelige i flash.display
pakke. Dette er kortfattet sammenlignet med (for eksempel):
importer flash.display.Bitmap; importer flash.display.BitmapData; importer flash.display.BlendMode; importer flash.display.Graphics; importer flash.display.Sprite;
Nå misforståelsen. Når jeg sier, "dette gjør tilgjengelig alle klasser," gjør jeg IKKE mener det hver klassen i den pakken blir automatisk samlet inn i din SWF. Jeg mener at enhver klasse i den pakken er tilgjengelig for deg i kortnavn når du skriver klassen. Så i det forrige eksempelet, ville jeg være fri til å skrive dette:
var sp: Sprite = ny Sprite; var g: Graphics = sp.graphics; g.beginFill (0); g.drawRect (0, 0, 100, 100); sp.blendMode = BlendMode.MULTIPLY;
Den koden bruker Sprite, Graphics og BlendMode, som alle er i flash.display-pakken, og alle må importeres. Enten tilnærming har det samme resultatet. Du er velkommen til å bruke villkortsimport.
Igjen, et enkelt eksperiment for de som trenger bevis. For dette eksperimentet trenger vi ikke-blits
klasser. Du må ha eksterne klasser tilgjengelige, enten du har skrevet, eller noe som Papervision3D eller TweenMax. Jeg kommer ikke til å laste ned og installere disse pakkene, men i form av min prøvekode bruker jeg en enkel pakke med fire klasser opprettet for dette formålet. Du kan finne dem, sammen med testfiler, i nedlastingspakken, i mappen "wildcard-import". Klassene er i bibliotek
pakke.
importere bibliotek. En
.var o: One = new One ();
importer biblioteket. *;
Dette skulle tyde på at selv om det ser ut som om vi importerer alt fra pakken sammenfatter vi egentlig bare de klassene vi faktisk bruker.
***** Nei jeg er ikke
Det er i dette følgende hypotetiske eksempelet:
pakke import SuperTrace; importere ActiveTween; offentlig klasse QuickTip offentlig funksjon QuickTip ()
De SuperTrace
og ActiveTween
Klasser er importert. Men de er aldri Brukt innenfor klassen. Flash-kompilatoren er vanligvis smart nok til å finne ut dette, og bestemme at de to klassene ikke trenger å bli kompilert for Raskt tips
klasse.
Selvfølgelig, hvis en annen klasse bruker den SuperTrace
klassen, så blir det samlet. Poenget er at kompilatoren er ganske god til ikke å inkludere unødvendige klasser i SWF.
Du kan bevise dette ved å sette opp en test som ligner på tidligere tester: sammenlign både byte størrelse og størrelsesrapporter for to SWFer som er identiske med unntak av bruken av en importert klasse. Du kan se et slikt eksempel ved å sammenligne prosjektene "import uten bruk" og "import-med-bruk" som er inkludert i kildeposten.
Hvis du av en eller annen grunn må sørge for at SuperTrace
og ActiveTween
klasser kompilere, selv om du ikke bruker dem i denne klassen, kan du tvinge det ved å bare henvise dem i kroppens kropp. For eksempel:
pakke com.activetuts import com.activetuts.SuperTrace; importer com.activetuts.ActiveTween; offentlig klasse QuickTip offentlig funksjon QuickTip SuperTrace; ActiveTween;
Det er nok å få kompilatoren til å se disse som nødvendige klasser, selv om linjene ikke gjør mye når koden kjøres.