I found it is very useful to load a swf into AS as class (what Embed metadata did). However, I am in trouble to do exact the same thing to content that is not load in compile-time (Loader and URLRequest). How can I do that?
If you want to load a specific class to instantiate it there are two ways. One is to use the getDefinitonByName() method and the other is to import the class normally from a SWC but excluding the SWC at compilation.
In both cases you need to make sure the SWF containing the class is loaded when you attempt to instantiate it.
Example:
1/ Create a library.fla with your assets
2/ Export library.swf (tick export .swc if you want to use the 2nd solution)
3/ In another document load library.swf
4/ When library .swf is loaded try :
var MyClass:Class = getDefintionByName("Ball");
var ball1:MovieClip = new MyClass();
var ball2:MovieClip = new MyClass();
If you want to use the SWC method just add the library.swc to your classpath and make sure you exclude it from you when you compile (just check your environnement's documentation, or let me know what you're running). Then proceed the same way as previously by preloading the library.swf before instantiating. The nice thing is that you will be able to write : new Ball(); transparently...
Related
Is it possible to play a sound from the library by its name and not Class Linkage in actionscript3?? Meaning if I have a sound named "mysound.mp3" in library and does not have a linkage name, can I play it dynamically in my code by any means?? I hope my question is clear.
In general it's not possible, because if you don't use your sound in some timeline it will not even be exported to swf.
If you are using it in timeline (so it's exported to swf) it's possible to extract it in run-time with some third-party libraries/as3 decompilers by parsing raw swf bytes, but I don't advice to go with that way - it's not stable and system resources consuming.
It's much more easy to set linkage, btw why you don't want to do that?
If you want to create an instance of a Class dynamically, you must call it by its AS Linkage. Why proceed in any other way?
How to proceed?
Right-click the sound file in your library and make it available for ActionScript by editing its Linkage properties: select Linkage to open up the linkage window > ActionScript > ActionScript Linkage : MySound (select Export for ActionScript and Export in frame 1). That will export your sound file as an ActionScript Class called MySound.
You can also select Linkage from the Library Panel menu and create or modify your AS Linkage:
So you can create a new instance of your sound Class and play it:
var s:MySound = new MySound();
s.play();
I have a question:
I have in Fla Library a object with the Class property like: com.tool.zoom linked to external as.
In timeline i call with:
mainApp.iniZoom("com.tool.zoom");
This fla is loaded in another FLA on I call iniZoom function.
It is posible? I get error 1007.
I hope you understand me, my english is not really good.
Thanks!
As I understand you, you are trying to instantiate a class exported from a FLA file. You select that object, do Export for Actionscript, and name class "com.tool.zoom", right? If so, you should use "new" clause like this:
var iniZoom:com.tool.zoom = new com.tool.zoom();
Obviously you need to have the AS file available at compile time.
Edit: given that you load the SWF, here is the solution that might work for you. Note you have to load all the classes you want to export from the SWF for your parent SWF to be available.
I am trying to load assets from an SWC into a SWF at compile time, in as3. I'm getting the information about which assets to load from a JSON file. I can do so statically, but when I try to define the names dynamically, I'm running into problems.
So for example I can do this:
onemech[+ tmpObj.id] = new mech3 as MovieClip;
And it loads the asset named mech3. But what I would like to be able to do is something like
var mechtype:String = "mech" + mechtypenumber;
onemech[+ tmpObj.id] = new mechtype as MovieClip;
Obviously, that doesn't work.
I looked around a bit and I found this here, which seems to be angling toward what I need, but I can't figure out how to apply what's said there to my specific situation.
For the record, I have control over both the JSON format and the naming schema within the asset SWC, if there's an easier solution there.
Thanks in advance for any assistance.
you just need something like this:
var s:Class = getDefinitionByName("Symbol") as Class;
addChild(new s());
I'm having trouble accessing content in an SWC. The main project compiles without error, but the assets (sound, music) aren't displayed or played.
My workflow:
i. Using Flash CS5
1. Create MAsset.fla
2. Import sounds, art
3. Assign class names, check export in frame 1
4a. Write out the classes in the actions panel in frame 1
4b. OR. Add a document class and write out the classes there
5. Export SWC. Filesize is similar to what it is when I directly import assets in the main project library.
6. Create Project.fla and document class Project.as
7. Import SWC into main project through the Actionscript panel.
8. Add code, which calls the class names from the SWC (e.g. DCL_UI_MOUSE)
9. Compile.
No compiler errors, but nothing doing. And the resulting SWF filesize doesn't reflect anything more than the compiled code from the main project.
Regarding step 4, if I just write the class name in the root timeline or document class, the compiler error will go away and the asset appear to be compiled in the SWC. But I have also tried:
var asset0000:DCL_UI_MOUSE;
And:
var asset0000:DCL_UI_MOUSE = new DCL_UI_MOUSE();
Regardless the assets don't make it into the final SWF.
What am I doing wrong?
What exactly do you mean when you say "Import SWC into the main project through the ActionScript panel" and "Add code, which calls the class names from the SWC"?
If you want to use an SWC as an asset library, you have to
add the SWC to the library path, and
always add the appropriate import statements to your ActionScript code.
There's no step threeâ„¢.
You can also use it as a runtime shared library by linking to individual library objects in the properties panel.
To get your library items to compile into the the SWC, check "export for ActionScript" and "export in frame 1", then write your fully qualified class name into the "class" field. "Base class" should be set to flash.display.MovieClip or flash.display.Sprite (for MovieClip items), or flash.display.SimpleButton (for Button items)- whichever fits the object best.
Also, note that it is customary to use camel case for class names (eg: DclUIMouse). The all caps DCL_UI_MOUSE would be used when naming a constant.
I am making an AS3 project in FB4. In our workflow, we have artists compile art into SWC files which the I then link as 'Referenced Libraries' in FB4.
Then I set the "Link Type" of the SWC files to "external" instead of merged into code. This should create SWFs corresponding to the SWC files in the output folder, right?
This doesn't seem to be the case. I am only seeing one SWF file: the main_app's.
I was trying to make it so that I can use a library manager to load the files dynamically.
I tried extracting the swfs manually, but it seems the main_app still compiles all the swcs to itself. I made sure the Link Type was set to external. The file size for the main_app between "external" and "merged to code" seem to be the same.
I've made a simple project in Flash Builder 4 and the only way I got the SWC->SWF happening is by creating a Flex Project instead of an ActionScript Project and selecting "Runtime shared library (RSL)" instead of "External". This is because the Flex framework have some classes that work out the loading of those libraries for you. It also automate the conversion (I should say extraction) process.
Now, if you don't want to create a Flex project just for this, you can extract the SWF yourself. The SWC file format is just a Zip containing a SWF and an XML file describing the content. You can then load dynamically this extracted SWF file using a Loader and setting the correct Application Domain. Here's a snippet of my sample project.
public class Web extends Sprite
{
public function Web()
{
//you will not be able to instantiate classes of your library until it's loaded
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
loader.load(new URLRequest("library.swf"), new LoaderContext(false, ApplicationDomain.currentDomain));
}
protected function onLoadComplete(event:Event):void
{
//here you can create instances of classes defined in your library
new Asset();
}
}
You might think that's a pretty tedious job to unzip+copy every time your designers update the library. You could automate this process with a script or an Ant file. Unfortunately, unless I'm missing something, it looks like Flash Builder doesn't want you to extend your build process, so you will still need a bit of hand work or completely convert to Ant (or something similar) to build.
Good luck!
From the moment the SWC is added to your Library, you should be able to access the SWC's assets by directly calling their specific class names . There's no need to try to get a SWF and load it with the Loader class. This actually defeats the purpose of using a SWC in the first place!
Let's say that , in your SWC, you have a MovieClip with a class name of GraphicAsset, to create a new instance , you simply do this:
var mc:MovieClip = new GraphicAsset();
In FB4's folder structure , have a look at your SWC in the Referenced Libraries folder & check the default package, you should see a list of all your assets.