Nieuws

Zo simpel, maar toch zo moeilijk
Geplaatst op dinsdag 06 november 2007
Na de codes loadMovie, getURL en loadMovieNum kwam ik na lang zoeken op de code _lockroot. Deze code hielp mij bij een probleem om vanuit een SWF bestand een ander (niet zelfgemaakt) SWF bestand in een nieuw venster (of movieclip) in te laden. Toen ik zonder de code _lockroot een SWF bestand wilde inladen kreeg ik foutmeldingen en in sommige gevallen werkte het SWF bestand niet meer zoals de auteur dit wilde.

Voor school moesten wij een interactief multimedia magazine maken. Een flash filmpje, waarin mensen zelf konden bepalen wat te gaan lezen of wat te gaan doen.
Één van mijn medestudenten had al een mooie basis opgezet waar alleen nog een aantal extra functionaliteiten in moesten komen. Het zoeken naar inhoud op de dvd en de mogelijkheid tot het spelen van een flash spel waren zulke functionaliteiten. Ik ben mezelf bezig gaan houden met het importeren van het spel. Dit leek allemaal niet zo moeilijk door de code
loadMovie("spel.swf", spelhouder);
toe te voegen.
Hierbij is spel.swf het flash bestand welke het spel voor moet stellen en spelhouder is een movieclip waarin het spel geladen kan worden.

Dit ging goed bij een normaal (zelfgemaakt) SWF bestand, maar wanneer het in te laden SWF bestand was van een andere auteur was of zodra er enige interactie van de gebruiker nodig was ging dit niet meer goed.
Ieder SWF bestand heeft zijn eigen tijdlijn waar alle acties in opgebouwd kunnen worden.
Wanneer je in je eigen SWF bestand een ander (bestaand) SWF bestand laadt in een movieclip, zullen alle verwijzingen naar de "_root" (de standaard tijdlijn) in het ingeladen SWF bestand gaan zoeken op de "_root" van het SWF bestand dat jij zelf hebt gemaakt. Wanneer het ingeladen bestand iets niet kan vinden op deze tijdlijn krijg je een foutmelding, of erger nog het ingeladen SWF bestand functioneert niet meer zoals dit zou moeten (volgens de auteur).

Toen ik op internet ging zoeken kon ik weinig oplossingen vinden voor dit probleem. De meeste mensen adviseerde om de code
getURL("spel.swf", "_blank");
te gebruiken.
Het leuke was dat dit wel werkte, maar het werkte niet op de manier zoals ik dit wilde. Deze code opende een browser en ging hier het betreffende bestand inladen. Een oplossing die werkte, maar die ik niet wilde gebruiken omdat ik een flash filmpje moest maken en hierin hoort geen browser naar voren te komen.

Het volgende wat veel geadviseerd werd was de code
loadMovieNum("spel.swf", 1);
Deze code zorgt ervoor dat een SWF bestand geladen wordt op level 1, dit komt dan boven je eigen gemaakte elementen te hangen. Maar gebruikte ik dit commando dan kreeg ik nog steeds de foutmelding dat een bepaalde target niet gevonden kon worden.

Na lang zoeken, kwam ik per toeval op de website van Adobe, misschien niet slim van mij om daar niet eerder te gaan zoeken, maar hier vond ik wel de oplossing die niemand anders tot nu toe had aangekaart. Vandaar leek mij dit nieuwsartikel wel handig. Het ging om de code
_lockroot = true;
Deze boolean (een variabele die waar (true) of niet waar (false) kan zijn) zorgt ervoor dat jouw eigen gemaakte tijdlijn geblokkeerd wordt, waardoor het ingeladen SWF bestand geforceerd wordt om zijn eigen tijdlijn te gaan gebruiken. Hiermee voorkom je alle foutmeldingen en functioneert het ingeladen SWF bestand altijd zo als de auteur het bedoelde.

De code die ik uiteindelijk gebruikt heb is als volgt
spelhouder._lockroot = true;
loadMovie("spel.swf", spelhouder);

Het heeft mij zeer goed geholpen, en jou misschien ook wel.

Bron: http://livedocs.adobe.com/