Volledige versie bekijken : Class Conflicten in geladen swf
B-Mantis
%Europe/Berlin %808 %2010, 19:23
Hallo,
Ik heb om het compileren sneller te laten gaan de meeste MovieClips en Sprites in een externe swf gedaan. Mijn hoofdbestand (die ik vaker compile) laadt dus wel de scripts, maar niet te bijbehorende MCs en Sprites.
Wat er gebeurt is precies wat ik wil, maar ik begrijp niet precies waarom dit gebeurt:
Dezelfde Classes, dit keer met bijbehorende MCs en Sprites, worden dus ook in de externe swf geladen. Als ik deze externe swf vervolgens in mijn hoofdSwf laadt, worden de MCs en Sprites automatisch bij de juiste classes gevoegd. Ik snap niet waarom dit zonder problemen gebeurd, en ik kan ook niet echt Adobe documentatie vinden die de regels uitlegt. Weet iemand wat die regels precies zijn? Ik heb verder geen afwijkende namespaces of aparte applicatieDomains.
TheDutch
%Europe/Berlin %080 %2010, 01:55
Hier heb je het leesvoer dat je nodig hebt: http://livedocs.adobe.com/flex/3/html/18_Client_System_Environment_5.html
Wanneer een class definities binnen dezelfde Application Domain geladen worden geldt dat de eerste leidend is. Dus wanneer de hoofdSWF een class definitie heeft die "Mantis" heet en de subSWF heeft ook een class definitie die "Mantis" heet, dan is die binnen de hoofdSWF leidend omdat deze als eerste kwam. In jouw geval is dat een positieve bijkomstigheid. Mocht je dit in een situatie niet willen dan zou je de subSWF in een ander Application Domain moeten laden, zie de documentatie in de link hierboven :).
B-Mantis
%Europe/Berlin %209 %2010, 05:02
Bedankt!
ik weet even niet zeker waar 'die' in je reactie naar verwijst :P
Dus:
HoofdSWF::Mantis
SubSWF::Mantis
Als SubSWF geladen wordt in HoofdSWF, is dan SubSWF::Mantis de klasse die ik verkrijg als ik Mantis opvraag?
Ik gebruikt dus zoals in de link die je hebt gegeven Usage A? Ik heb alleen in mijn code helemaal geen Context aan de loader meegegeven:
var loader:Loader = new Loader();
var req:URLRequest = new URLRequest(String(args[i])); //args[i] is dan bijv "mySwf.swf"
loader.contentLoaderInfo.addEventListener(Event.CO MPLETE, loaderCompletedHandler);
loader.contentLoaderInfo.addEventListener(IOErrorE vent.IO_ERROR, ioErrorHandler);
loader.load(req);
Ik wou dat ik dit eerder had geweten! Dit gaan me een hoop compile tijd schelen :)
TheDutch
%Europe/Berlin %553 %2010, 13:16
Het woord "die" verwijst naar een class definitie met de naam "Mantis". Omdat deze in mijn pseudo voorbeeld geen package heeft komt er niets voor te staan.
In jouw situatie maak je gebruik van Usage B.
Alle class definities van SubSWF worden in hetzelfde Application Domain geladen als die van de HoofdSWF. Mocht de HoofdSWF reeds eenzelfde class definitie hebben als de SubSWF dan is die van de HoofdSWF leidend.
Een class definitie wordt onderscheiden door zijn volledige naam. Dus bijvoorbeeld voor de class Loader is de volledige naam flash.display::Loader.
Laat maar weten of het meer duidelijk is zo :).
ps. Het is inderdaad zeer handig om dit allemaal goed te kennen. Kan erg goed van pas komen zo nu en dan.
Jan
%Europe/Berlin %555 %2010, 13:20
Als SubSWF geladen wordt in HoofdSWF, is dan SubSWF::Mantis de klasse die ik verkrijg als ik Mantis opvraag?
Net omgekeerd.
-Op het moment dat HoofdSWF afgespeeld wordt, zullen al haar classes in een application domain gestoken worden.
-Class names binnen eenzelfde application domain moeten uniek zijn en bestaande classes kunnen niet overschreven worden.
-Als je SubSWF inlaadt, worden al haar classes toegevoegd aan het application domain, tenzij daarin al een class met die naam bestaat. In dat geval zal de bestaande class gebruikt worden.
Edit: wat TheDutch (iets sneller) zei.
Jan
B-Mantis
%Europe/Berlin %636 %2010, 15:16
Toch zie ik dit niet gebeuren, want alle identieke classes in mijn SubSWF zijn voorzien van MCs, en die in mijn MainSWF niet. In de applicatie zie ik echter wel de MCs terug!
Jan
%Europe/Berlin %735 %2010, 17:39
Het is simpel getest. Plaats een verschillende trace bij elke compile actie en kijk welke je ziet. Dan weet je ook welke class er uiteindelijk gebruikt is.
Voeg die twee swf's anders ook eens toe als bijlage.
Of inspecteer ze zelf hier:http://haxer.be/SWFTools/SWFReader.html
Via een of meerdere SymbolClass tags worden id's van assets (movieclips etc) gelinkt aan een bepaalde classname.
Jan
TheDutch
%Europe/Berlin %746 %2010, 17:55
In jouw situatie maak je gebruik van Usage B.
Mijn fout! In jouw situatie maak je gebruik van Usage A inderdaad :).
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.