ActionScript 3.0 :: Inheritance When Using Loader.contentLoaderInfo. ApplicationDomain.getDefinition?
Jan 13, 2010
I have made a Flash app in which there is an class called "MyGame.Person" which has multiple subclasses "MyGame.PoliceMan", "MyGame.FireMan", "MyGame.Doctor" etc. "MyGame.Person" is defined in the main .fla file, but the other classes are each defined in separate .fla files. I have split each into its own .swf file so that I can extend the game without having to reissue the main .swf file.I then use a Loader to download each .swf file and call
var assetClass:Class = myLoader.contentLoaderInfo.applicationDomain.getDefinition(assetClass Name) as Class;
to extract the class from the downloaded swf file. So if assetClassName is
I'm building a 10 channel mixer/remixer in Flash. Users can select a "song" to load from an xml driven combo box at the top of the application. In the document class, there is a function that takes the selected item from the combo box and loads in an external swf, which just serves as a library for the 10 sounds of a particular song. I then have to extract each of these sounds by their class names ("Track1", "Track2", "Track3", etc...) and send them off to their respective "MixerChannel" objects. As you can see, the following code block in the "initHandler" is pretty long and redundant. Is there any other way/shortcuts I can use to reduce the code a bit?
I have been developing two seperate flash projects and the time has come for them to merge. To do this i have decided that, rather than try to mash the code together, i will simply use a loader to load and unload the second SWF as needed. My problem is that the SWF to be loaded uses:
Code: var className:String = Entities[No]; var libraryDomain:ApplicationDomain = stage.loaderInfo.applicationDomain; if (libraryDomain.hasDefinition(className)) { var MyClass:Class = libraryDomain.getDefinition(className) as Class; item = new MyClass();
[Code]...
This works fine seperately, but when the SWF is embedded into the parent SWF it seems to use the parent's library rather than its own. (if i put an item in the parents library it can load it, otherwise it throws an error). Is there any way to keep the child SWF using its own library? and if not, any other way to do this?
I am loading images dynamically from the web into my swf. I use a loader class and add an Event Listener to the loader so it will add the image to the stage when done.
Code: for (var i:int = 0; i < number; i++){ var poodleLoader = new Loader(); poodleLoader.load(new URLRequest(urls[i])); poodleLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, showPoodle); }
But what I do not manage to do is referring from the Event.COMPLETE-event to the loader object in my showPoodle-function. How do I refer to it? I was thinking addChild(e.target.parent.data) but it tells me the contentLoaderInfo has no parent?
I've one loader which load a png file. I used contentLoaderInfo to intercept COMPLETE event like this:
loader.contentLoaderInfo.addEventListener(Event.Complete, handler); The problem is that at the complete event I want to push this object into an array, like this:
function handler(e:event){ var array:Array = new Array(); array.push(e.target); }
E.target is the reference to the contentInfoloader, while I need the reference to the loader itself. How can i resolve this issue?
What I am trying to do is to use shared runtime library by loading a swf ('index.swf') which has numerous library objects which are named in sequence such as:
I am able to load the swf('index.swf') without any issues and even am able to load the right library asset, but I have to declare the full name as string such as getDefinition('orange1'). What I would like to do is to match first three letters of string and then run a for loop to load up all the classes that match the first three letters. I usually can do this by employing indexOf() method.
here is my code:
public function loadContent():void { ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onloadHandler);
Can somebody explain what is the difference between getDefinitionByName and getDefinition inA AS3?When I load an external SWF I can't use getDefinitionByName because I get an Error #1065.
But using externalSWF_ContentLoaderInfo.applicationDomain.getDefinition works OK.So, why getDefinitionByName doesn't find the className?I mean, if the definition is inside the applicationDomain of the loaded SWF, why is not in the main SWF too? (I'm using Flex). I can't create new tags so I can't add the tags getDefinition and getDefinitionByName.
EDIT: For whatever reason, it works in the browser but not when compiled/debugged within the IDE.I can't get my external SWFs to pick up on dispatches from my singleton event manager (EventDispatcher). Here are the particulars:
I add children from an external SWF using the getDefinition method to my main SWF.I'm using a singleton EventDispatcher that is in charge of listeners and dispatching.Using a custom event class.In this code, I am trying to get a mute button to tell the main SWF that the mute icon has been clicked (SoundClipEvent.MUTE_CLICK). After the sound has been muted, it should dispatch the event (SoundClipEvent.STATE) and confirm to the muteIcon the state. Currently, the mute icon successfully dispatches the MUTE_CLICK event and the main SWF document class is able to pick it up. MuteIcon (child SWF MC) hears nothing from the singleton.
SoundClipManager.as:
import flash.events.Event; import flash.events.EventDispatcher; public dynamic class SoundClipManager extends EventDispatcher {
I am instantiating assets (skins) from external SWF:
Code: var asset : Class = loader.contentLoaderInfo.applicationDomain.getDefinition(myName) as Class; var myClip : MovieClip = new asset() as MovieClip;
all works well but...The assets in library are basically images (jpegs) and I would like to avoid encapsulating them into MovieClips when you can export them for actionscript directly. This could significantly improve my work flow, but...
The problem is that the base class for any image in the library is BitmapData and the constructor for BitmapData needs two arguments, width and height which could vary...
Code: var asset : Class = loader.contentLoaderInfo.applicationDomain.getDefinition(myName) as Class; var myBmp : BitmapData = new asset(?, ?) as BitmapData ;
As a part of a class I have been asked to place a preloader in front of my projects. I can't believe how tough this is. I get the best results when I use an URLRequest, but I want to understand the timeline.When I put a working preloader in front of my movie it doesn't start "ticking" until some middle point like 20%, or 70% depending on the file size of the movie. When I trace the bytes.Loaded it doesn't start counting until 700K or so.I have looked at several different preloaders and none seem to work as well as the tutorial. Can someone direct me to an "easy to understand" source that explains the loaderInfo / contentLoaderInfo class?
When I preview the file I get the following errors: Quote: 1119: Access of possibly undefined property bytesLoaded through a reference with static type flash.display:Loader. 1119: Access of possibly undefined property bytesTotal through a reference with static type flash.display:Loader. If I comment out the onProgress function and it's associated event listener the file runs fine. I believe both event listeners call the flash.events
I am loading a content SWF into a container and I want the content SWF to exist in a child application domain to the container. Therefore, the structure should look like:
I have a main swf that is a container for various flash games. I want this "console" to be in a different applicationDomain as the games to avoid class/function naming problems. As I understand, the default behaviour allows loader and loadee to exchange information. How do I make sure that classes for the console doesn't interfere with the games?
I am loading a content SWF into a container and I want the content SWF to exist in a child application domain to the container. Therefore, the structure should look like:[code]That if-statement is being triggered, meaning the content does not recognize the existence of a parent application domain.
I have a preloader function that uses contentLoaderInfo to load swfs ont the stage. It works fine in simulated download in the Flash Player. When I run it on my host the swf file finishes downloading before the preloader appears to run. I use the word appears because I only sometimes spot a glimpse of a graphic that indicates the loading process.
Are there known discerpancies between host and Flash Player realities?
Are there any subtlties with using with contentLoaderInfo?
I basically have rectangles which I want to replace with images I load through XML references. The rectangle instance names are from image0-imageNumberWhatever. I've got everything working, the only thing I can't seem to do is once each image is loaded, it fades in instead of randomly appearing. Below is my code:
I've got a system that loads in little avatar images. When the avatar is loaded in I resize it to 24x24.
Here's some ActionScript Code: var urlReq:URLRequest = new URLRequest( String(playerInfo.vector.scalar.(@id == "AvatarURL")) ); var ldr:Loader = new Loader(); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, resizeAvatar); ldr.load(urlReq); avatar.addChild(ldr); container.addChild(avatar);
Here is the resizeAvatar function... ActionScript Code: // Resizes the avatar to fit correctly public function resizeAvatar( e:Event ):void { e.target.content.width = 24; e.target.content.height = 24; e.target.content.smoothing = true; }
Now I'm using the e.target.content item because as far as I can see that's the only way to get at a way or resizing the image dynamically (using an Array isn't an option). Here's the funny part, the above code works perfectly in the Flash IDE but when on a live site that Event.COMPLETE is not calling!? The image is loading in but it never gets resized.
The current implementation of the Flash Player ApplicationDomain with regards to override class definition seems like a giant security flaw to me.A parent SWF has complete control over what child SWF they want to load and add to its ApplicationDomain. It stands to reason that if the parent trust the child SWF enough to load the file, it should also trust the class definition defined by the child SWF and use those definitions.
In contrast, a child SWF has no control over where it is being loaded into, or if it want to be loaded into another SWF at all. Therefore, there is no reason for the child SWF to trust the class definitions defined by the parent SWF.I recommend changing the current implementation of the ApplicationDomain and allowing a child SWF to override any conflicting class definition in the parent's ApplicationDomain.
I'm using Flex Builder 3 to build what will be a fairly large project. I'm suffering from modules stepping on each other and a conflict between application/module. My structure looks something like the following:
How to access a public method in the swf loaded in a new ApplicationDomain?
ActionScript Code: var appDomainA:ApplicationDomain = new ApplicationDomain(); * var contextA:LoaderContext = new LoaderContext(false, appDomainA); var loaderA:Loader = new Loader(); loaderA.load(new URLRequest("application2.swf"), contextA)
I want to access a public method in application2.swf from the main swf that loaded it.
I'm accessing the classes from an externally loaded SWF so that I can "skin" SWF applications at runtime. Everything works fine but I'd like to make it as dynamic as possible and allow developers to access all the class definitions in a loaded SWF without having the FLA file or a list of their names.
I've refactored a whole project, splitting the main FLA file into 1 main FLA file and 10+ asset FLA files. Each asset FLA file main stage is empty and has no Document Class associated. Instead, each asset file's library contains a MovieClip linked to an .as class. The loader is first added to the stage, then is told to start to downloading the 10 asset SWF files.
When the download is completed, my application starts instancing the class coming from the asset files. Now, the problem is the following : when I try to access a stage instance from a downloaded clip (for example, a textfield that has been drag&dropped and named via the Flash IDE) , I encounter the #1009 error, saying the stage instance is null...