ActionScript 3.0 :: Modifying Library Assets At Runtime?
Feb 19, 2010
I'm building an avatar class that will allow a user to swap out character assets during runtime. The idea is pretty straight forward. The artist I am working with designed the art assets for the individual pieces of the avatar and performed the animations in flash. Since the animations were created in flash using vector art as opposed to pre-rendered 3d, I want to simply replace each individual movieclip within the animation with the asset selected by the player.
Problem:The issue i'm running into is that the animations have several key frames. My thought is to load the avatar object (an external swf) into my main application. Once loaded, I obtain a reference to all library assets that are used in the animations. For example, to get the face, I have something like:
This is the concept I want to get into code: 1) Have a Document Class attached to the Main.swf 2) Have a Assets.swf that has all MovieClips that set to Export and have been given actual Classes. 3) Have the document class Load the Assets.swf. 4) Once loaded, be able to create instances of the MovieClips from Assets.swf by writing the code in the Document Class of Main.swf
I can get all this to work.. However what I am finding is if I have a public function on the Document class that creates an instance of something from the Assets.swf, lets say var okTest:TestClass = new TestClass(); I have to also import it in the Document Class (import com.test.TestClass). When I compile it, yes it works. If I remove the Assets.swf file it doesn't display. Ok.. But I've noticed that the Main.swf file is including all the imported classes (eg: com.test.TestClass) so the Main.swf filesize is pretty much the same as the Assets.swf file.
I also ran it through a decompiler and can see yes in fact Main.swf is including all those Classes from Assets.swf because I'm trying to access them from Main.swf and had to import. So the biggest question is how do I go about this properly? Being able to load the asset file that has movieclips etc that have custom classes. Then create instances of those classes within the document class but only if Assets.swf is loaded.
I have built a simple flex application (using BlazeDS) which displays "Person" details by invoking a java service using flex remoting. So, my Person class looks something like this:
class Person { public int age; public String name; }
As a java developer, here is my understanding: When I run the front flex app in my webapp, an RPC call is executed and BlazeDS does the hard work of invoking the right method, obtaining the result as an object, converting the object to AMF format (serialization). And, then the web/app server sends back this response to the requesting app over http. The flex app now does the task of deserializing the object received in AMF format and somehow make use of it.
Here is my question: I would like to modify the response before it reaches the Flex application by modifying the attributes of the person object. I have a Filter in place to do this. However, I am not sure as to how I would deserialize the AMF stream, modfiy the object, serialize the object back into the stream / reconstruct the stream somehow.
Is there a way to doing this? Where should I start? If the question was too confusing, here is a shorter version: How do I modify the response stream of content type AMF-X, before it reaches a flex app using a java filter?
I'm trying to load a swf compiled by the Flex SDK into a swf exported by the Flash IDE and instantiate the assets by way of getDefinition(). Normally this works fine with assets exported from the Flash IDE then loaded into another swf also from Flash IDE.This is how I could normally do this using only the Flash IDE:Loader - > Using same ApplicationDomain - > getDefinition(class)Now, using the 'Test.as' compiled from Flex SDK using the [Embed] metadata tag:Loader - > Using same ApplicationDomain - > getDefinition("Test_" + class)The problem is I'd rather not have to keep track of the asset libraries loaded to prefix the class name I'd like to get (('Test_" + class) vs (class)). Is there any way of doing this without referencing the library the class is being pulled from or without accessing the original loader? This way I don't need to know which swf the asset is coming from, just the class name that I could instantiate from the current ApplicaitonDomain.
I have been handed a project that was built to embed all assets at compile time and I need to update the app to load assets from a remote server instead. Right now everything is being embedded as follows:
[Embed(source="assets/gfx/tutorialBg.png")] public var tutorialBg:Class; [Embed(source="assets/gfx/tutorialStraightArrow.png")]
[Code]....
These Class variables are being referenced all over the app to place the assets so I'm hoping to be able to update the code to load the assets and store them in these same Class variables. So far the methods I've tried have not worked. I've tried using URLLoader and it loads the images fine, but I'm not then able to extract the image and cast it as type Class to these variables.
I have an animated character swc that is an empty skeleton basically (has all the body parts, animations, and functions/vars). I want to essentially put different clothes on that character at runtime so I don't have to have many copies of this character in my resources.
For example, I have 'skeleton' (the non-clothed model) and 'Bob', 'Jane', and 'Mary' characters. 'skeleton' is animated and fully works as an exported swc, and to get the other characters in their clothes/skins, I open up Flash CS5 and replace the movie clips with the 'clothed' versions of the components. To clarify,'skeleton' has "body parts" as movie clips that are all animated on the timeline, such as "head","face","left arm","right arm", etc. I open up 'Bob', who has the same exact design as 'skeleton', with the exception that 'Bob' has all the clothes and such as differently-designed movie clips. The size, shape, orientation, and reg points are all the same across all the components. After I've replaced all the movie clips in 'skeleton', I export it as a swc named 'Bob.swc' and I do this for all the characters.
What I'm asking is, how can I do this process ^, but at runtime instead, so I don't have all these duplicate root swcs ('skeleton' has a lot of frames on it) so I can cut down on a bunch of space? So I can do something like:
// bob gets all the actions and animations of skeleton var bob:UIMovieClip = new skeleton() // replace the body movieclip with a new looking one bob.body = resources.bodyassets['bob']['body']
I'm making a game for the browser that has a lot of assets, but not all of them are needed at once. I'm deciding whether to embed my assets at compile time or load them at run time. I'm not concerned about loading time -- only the performance of the game during run-time.
If I load these assets and store them into memory for eventual use later in the game, will they consume system resources just being latent in an AssetLoader? Will that affect performance?
If I embed these assets, will they consume system resources just being latent in the compiled SWF?
Is there a difference in performance between these 2 methods?
I started using Flash CS5. I spent many hours working on a .FLA file. Saving as I went and at one point Flash CS5 crashed during the save. The .fla file is now corrupt. The new .fla format is essentially a .zip file. So I was able to change the file name to *.zip and explore inside of it. The DOMDocument.xml file is corrupt and dead. The DOMDocument.xml is the timeline so all my placement and animation is gone. However, my LIBRARY folder is in tact and has all of my library items as *.xml files. How I can get those library items into another .fla file so I don't lose ALL my work? I've tried creating a new .fla file and dragging the LIBRARY folder into the new .fla, but my library items don't show up when I load the new .fla in the Flash CS5 IDE.
Since I can access the library assets from external class, I have a question :
1. Is it possible to use any of library assets of one movie into another? Let's say in my movie A, I have McA1 movieclip in the library. Is it possible to access/display/addChild McA1 in movie B?
2. If there's a case that Movie B is loaded into Movie A - does all the library from Movie B will be inherited into movie A - vice versa - so it makes them accessible?
3. If the answer of 1, and 2, is no and no, is there any work around to make any library asset accessible accross the board? Is this what so called runtime sharing? Do you have any resource that I can refer to?
I have fla_A, and fla_B. fla_B contains a single MovieClip which contains a bunch of MovieClips that are all set to Export for ActionScript (NOT first frame, as this will need to be preloaded). I want to load fla_B into fla_A, and be able to instantiate the nested clips (inside fla_B) as if they were native to fla_A itself.
After loading the swf, I'm using:
[Code].....
Can I cast "e.currentTarget" as something useful like MovieClip (well, not MovieClip, 'cause that doesn't work), or something that will stick around from which I can dynamically load things?
I have a great shared library tutorial BUT I don't like one section. Assets.swf is the shared library with a variable array called availablegraphics on it's timeline where we put in the available assets That is the bit I don't like. Isn't there a better way to loop through to get the assets. Also they use a loop using library.availablegraphics - which I have never seen before and seems a little weird. In conclusion it's great but is there a better post or tutorial on shared library and how to loop through the assets without knowing exactly what or how many there are.
Specifically, various MovieClips seem to be missing all of its content. I work in flash for a while, make a series of changes, save the file and close it, and then reopen the file. Upon reopening, the artwork inside the MovieClip does not appear. The former artowrk can be bitmaps, shapes, drawn objects, or even other symbols. I can take the time to replace the missing artowrk inside the symbol (the symbol is still there on the stage and in the library, just the artwork is missing), but three saves and closes from now, the artwork may be gone again, or new MovieClips may appear empty - there appears to be no discernable pattern yet.
When I drag and drop images in flash library, the path is sometimes relative (./somefolder/someimage.png), and sometimes it is absolute (D:lahsomefoldersomeimage.png).
How can I use only relative paths in flash library in order to be able to update all images from any computer and/or from any folder ?
what I am trying to do is create class that loads assets(images) from library and places them on the a stage.I want my class to be something like this...I know it needs to be more complex, I am just trying to "draw" out my idea for you, I have tried using getDefinitionByName to pass the linked MovieClip and some variations on that but for some reason I can't get it to work.[code]
I have a swf called "myfile.swf" with a mp3 set to export for actionscript, and the Class has been called "soundName"With the following code, the sound plays great...
Actionscript Code: var bgURL:URLRequest = new URLRequest("myfile.swf");var swfLoader:Loader = new Loader();swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete);swfLoader.load(bgURL);function loadProdComplete(e:Event):void { var tmpSound:Class = e.target.applicationDomain.getDefinition("soundName") as Class; var snd:Sound = new tmpSound() as Sound; snd.play();}
This lets the sound play great. But, because of what I'm trying to do, i would like it better to put the swf into a movieclip, then play the sound from there.
But i cannot seem to get it to work. The following code adds the movieclip to the stage fine, but then i have no way of accessing the library assets (i.e the "soundName" mp3) from the swf inside of the movieclip.
Actionscript Code: var bgURL:URLRequest = new URLRequest("myfile.swf");var swfLoader:Loader = new Loader();swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete);swfLoader.load(bgURL);function
I have several small movie clips saved in the library of myCS4 Flash.fla file, I want to make them available to dynamically add to the display list as children, based on the button clicks of the viewer. I can get it all to work fine via Symbol Properties > Linkage > Export for Actionscript. When the movie clips are set to "export for actionscript" from the Library, playback seems to hang on frame 1 until all of these exported assets have downloaded.
The big problem is that I have an ultra-simple but totally custom preloader/progress animation coded in a loop in the second and third frames, which kicks out to frame 4 and continues playback as soon as the download is complete. Because of this, the preloader has essentially become useless - because all that can be seen is several seconds of empty stage, until the vast majority of the bulky assets have downloaded. Then the preloader flashes onstage for just an instant, and disappears because the content is already up.
So, my questions are: A) Is there a SIMPLE alternate method to load these library assets in such a way that it doesn't cause this major lag on frame 1? B) Failing that, I suspect I may have to retool my preloader to run as an ENTER_FRAME event in frame 1. Is this worth the effort (can this potentially resolve the lag issue and allow for a meaningful preload progress animation, despite the lag from the asset export?)
I've seen that it's very simple to create a document class (a class associated to the main timeline itself), or an instance of a class which is linked to a single asset (e.g. a movie clip).But what if I need to implement a class (let's call it Main) which uses multiple assets from the Flash library? The only way I know to do this is by instantiating any asset with its linked class, and passing them all to the Main constructor like this:
ActionScript Code: var asset1:Asset1 = new Asset1(...); var asset2:Asset2 = new Asset2(...); var asset3:Asset3 = new Asset3(...);
[code].....
This is kind of a tedious process, especially when the composition hierarchy is long and you have to pass them all as arguments through many nested classes.For instance, I needed to link a preload sprite (the typical circle in gradient color which is constantly rotating until the load is complete) from the library to any thumbnail class of a gallery, which in turn is part of another class, which in turn is part of the main class. So I needed to pass this preload clip as an argument throughout the nested classes.
I have built a component, but the assets do not appear in the symbol library of the destination fla when I drag the component to the stage. This is fine, except that I have embedded a font in the component. To ensure the font exists in the destination swf, it must exist in the symbol library of the destination fla.My component extends the UIComponent class, and I have a component shim, although I'm still not entirely sure of its functionI have followed all of the steps found in the 9 part MenuBar tutorial, and everything works, except for this one issue.
I have built a flash animation (for a web site) that requires a number of decent quality JPG images. I don't display all of these at the start, so I don't want to wait for them all to load before starting the animation. Thus I want to be able to load these images in the background - the obvious process would involve MovieClipLoader.loadClip() method. This works fine if I am loading into an INSTANCE of a moveclip (either existing on the stage or one that I creat in actionscript) - but I really want to load into a library movieclip.
The problem is that I end up using these images in two different movies on the stage - each pulls from a movieclip in the library (that contains the image I want). So my original thought was simply to load (using loadClip()) into the library movie - which in turn would show up in the two stage movieclips that have this library clip in the timeline. However, I cannot seem to get loadClip() to work with a library object.
I tried exporting the library movieclip to actionscript (giving it a name) - but loadClip() doesn't seem to want to load into it. I can only get loadClip() to load into an instance that exists on the stage.Sorry if I am asking a stupid question - I don't do a lot of flash programming - although I have extensive programming experience in other languages.
Does anyone know any as3 libraries that allow you to scale, rotate, skew, etc.. images during runtime? I have found the greensock transform manager class, but would prefer not to pay $300.
I'm having a little trouble setting up a new project (an e-Learning) that I think will benefit a lot from RSL.My case is something like this[code]...
The Main will be the first movie to be instantiated, then, all that is necessary from here will be download.Every lesson will be put in a fla/swf apart from the "Architecture" (that is the Main, Scenes, Navigation and a whole bundle of classes called Engine) and will be added at runtime inside the Scenes.
The Engine is responsible for handling repetitive and necessary tasks, events, common methods, communication with server, among other things.The Navigation is responsible for handling user input, as the navigation (next/prev lesson and such), and then passes it to the Engine, that will manipulate the Scenes (and it's children).
Well, I have some restrictions too:Every swf file that will be handed to our client need to have less than 80kb, which means I'm tied.I can't compile the whole thing as a package ready to delivery.As size counts, I need means to alleviate the load as much as possible.So, I searched a lot these days and found out RSL.I've created some tests to know better how to use this and, of course, got into a trap.
I haven't been able to set up my Flash correct, haven't any success with the "Library Path" (under AS3 configuration), haven't been able to compile classes inside the SWC...
Another thing is that I won't make the lessons, only the Architecture.Those lessons will be created by people that may not have any knowledge in AS3 (OOP or program logic) at all.And I'm not inclined to delivery the whole engine (source code) to anyone from outside that may mess with it, making the whole app (apps, in fact, we'll produce hundreds of e-learnings).
How to use RSL efficiently
How to bundle classes inside the SWC
How to package all that is imperative for the whole thing work in the SWC, and then, delivery only this SWC
Is it possible to delete the library items at runtime?
I am loading b.swf in a.swf. After some time b.swf unloads and c.swf is loaded inside a.swf. Though the b.swf unloads but the library items of b.swf remain there and conflict with the library items of c.swf. c.swf has some items with the same name as in b.swf. c.swf shows the movieclips from the library of b.swf with similar name.
I think the best way would have been to load these assets externally instead of keeping them in the library if we want to destroy them at runtime. But, we have a large number of already constructed files. Ability to destroy the library items at runtime will also help maintain memory usage in limits.
I'm having a little trouble setting up a new project (an e-Learning) that I think will benefit a lot from RSL. My case is something like this:
Main.fla - A Shell Scenes.fla - I'll explain this in a minute Navigation.fla - Some kind of GUI Lots Of Fla Files - The Lessons
The Main will be the first movie to be instantiated, then, all that is necessary from here will be download.Every lesson will be put in a fla/swf apart from the "Architecture" (that is the Main, Scenes, Navigation and a whole bundle of classes called Engine) and will be added at runtime inside the Scenes.The Engine is responsible for handling repetitive and necessary tasks, events, common methods, communication with server, among other things.
The Navigation is responsible for handling user input, as the navigation (next/prev lesson and such), and then passes it to the Engine, that will manipulate the Scenes (and it's children).Well, I have some restrictions too:Every swf file that will be handed to our client need to have less than 80kb, which means I'm tied.I can't compile the whole thing as a package ready to delivery.As size counts, I need means to alleviate the load as much as possible.
how to use this and, of course, got into a trap.I haven't been able to set up my Flash correct, haven't any success with the "Library Path" (under AS3 configuration), haven't been able to compile classes inside the SWC...Another thing is that I won't make the lessons, only the Architecture.Those lessons will be created by people that may not have any knowledge in AS3 (OOP or program logic) at all.And I'm not inclined to delivery the whole engine (source code) to anyone from outside that may mess with it, making the whole app (apps, in fact, we'll produce hundreds of e-learnings).How to use RSL efficiently How to bundle classes inside the SWC How to package all that is imperative for the whole thing work in the SWC, and then, delivery only this SWC
I have a problem and I'm not really sure where to start. What I have is an animation of a character in the library. The Character is made up of a few movieclips for the body that move about and one for the face that holds a stock photo.I have a camera section that grabs an image of the users face and now what I need to do is swap the stock face photo for the one taken in the last scene.
Kindly note I am not asking what SWCs are used for, I know about that. I want to know, the use of RSLs in flash. Say i have some useful classes which i currently am using by specifying the particular folder as an "Additional source folder". So, can i make use of RSL here. If not, when and why i need to use RSLs ( I use SWCs without any problem, but i wanna know how to make use of RSL, without making SWCs, ie just by bunch of actionscript classes )
I am facing an error using shared libraries. The error pops up during compile and only happen when I give an instance name to my imported asset. Let me describe further:
I have an asset library where all movie clips in this file are exported for runtime sharing - LibraryA.swf
Next is the file that uses the assets - ShirtA.swf
What I did is to import an asset from LibraryA.swf (e.g. collar) into ShirtA.swf. Now I have collar movieclip in my ShirtA library. I drag an instance of it to the stage and compile. No problems.
I then gave this instance a name, "myCollar". I tried to compile again, and I get an error from Flash IDE - 1046: Type was not found or was not a compile-time constant: collar
I'm creating library swfs in as3 this way, works like a charm (except for the slow mxmlc compiler):
package { import flash.display.Sprite; public class Library extends Sprite {[code]....
I would like to create the same kind of libary using swfmill. I've tried the following swmfill simple xml:
<movie version="10">
Examining the libraries in FlashDeveloper's explorer reveals that the as3 library exports BOTH classes and symbols, but the swfmill library exports ONLY symbols.My host application is accessing the as3 library assets this way:
private var loader:Loader = new Loader(); private function onCreationComplete():void { this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);[code]....
But with no exported swfmill classes, there's obviously nothing to instatiate...Is swfmill expected to export classes this way? If not,is there a way of accessing the symbols without instantiating them as classes?
I want an air application to be able to update the assets it uses, but minimizing the download needed, so only downloading files added since it last updated.I'm thinking this would include a server portion which would zip the needed files based on a version number? Has anyone implemented anything similar / got any thoughts on the best approach to building this sort of system?
I just finished up my site, and this is the only thing holding me back from publishing it. Whenever I "Test" my site, I get this error: " Your content will not stream. Runtime Shared Library (RSL) preloading will require all of your content to download before the first frame will play.
To prevent this you can change the Runtime Shared Library Library Settings, in the Advanced ActionScript 3.0 Settings dialog which can be raised from the Publish Settings dialog.The Runtime Shared Libraries being preloaded are:
textlayout_1.0.0.595.swz for TLF Text"
Does anyone know how to correct this error? If you do, could you please walk me through it step-by-step. I am still very new to "Flash Professional (CS5)" & "ActionScript (3.0)"