Here’s something i created in Flash CS3 which was supposed to be the beginnings of a new AS3 website. During development i encountered some problems preloading external classes exported after frame 1. Unable to find a solution to fix my application i hacked out the example shown below. It works great but i would like to get some feedback from the community to see what you think. If it’s a bad way of doing things please tell me.
Download the original files here to see what i did. [UPDATED SOURCE 240908] Added comments to com.strangeloopstudios.main.Site (which is the document class) to further expain the hack.
Here is an update for Ian to illustrate how i added a button to the application. [NOT UPDATED]
August 6th, 2007 at 4:33 pm
is there a reason why you have so many frames inbetween the actions? could you not have done that in 4 frames (your site starting on the 4th)?
August 6th, 2007 at 5:46 pm
Hi Ian
Yes i could have used 4 frames but i do it like this so i can easily read the frame labels at a glance.
August 6th, 2007 at 6:09 pm
ahh thanks for the quick reply. i also have a question related to this file. (sorry i am using your preloader on my site that i’m designing because i have not been able to find one for AS3 only AS2) i have changed all the graphics so nothing is similar.
My question is your Site file makes it so you can address MovieClips, which i need, but i also have some SimpleButton’s that i need to do as well. I was wondering if you would be able to tell me what to add to be able to do that.
my .fla file is here:
http://www.fileden.com/files/2007/8/6/1326286/balfourwest.fla
and the Site file where the document class is here:
http://www.fileden.com/files/2007/8/6/1326286/Site.as
August 6th, 2007 at 7:19 pm
the reason i want to add them as buttons instead of movieclips is because i have them change color when the mouse hovers over them, and secondly i want to have the buttons make the movie gotoAndStop and a certain frame. or is this possible with movie clips?
you can always email me at iscofield@gmail.com
thanks so much!!
August 8th, 2007 at 12:22 am
well i figured it out already. but what i was trying to do was add not only movieclips to the movie on the site frames, but buttons as well. and because i could only declare movieclips in your source files, what i ended up doing was deleting the section for declaring the navigatio movie clips and changed in the publishing settings to automatically declare stage instances.
are there any drawbacks to doing it that way, because it seems to be working fine, not only in the flash preview but on a hosted server.
thanks again for your help
August 8th, 2007 at 9:15 am
Hi Ian,
Does the preloader still work correctly for you? Can i see your example running on your server?
Have you got any exported classes remaining or did you remove them all to fix the button problem?
I’ve just added a custom button to my example, here’s what i did:
To add a button to the project i drew an icon on the stage and made it a Button in the Flash IDE (via F8) with an instance name of’ ‘ian’. I added the over and press states as you would normally and then in my main Site class i added these new lines of code:
import flash.display.SimpleButton;
public var ian:SimpleButton
The publish settings remained the same so i’m not automatically declaring the stage instances.
I’ve updated the source files so you can see.
August 8th, 2007 at 12:52 pm
http://svn.50webs.com/balfourwest/
is the website i have it incorporated in.
you can look at my fla/.as file here:
http://www.fileden.com/files/2007/8/6/1326286/balfourwest.fla
http://www.fileden.com/files/2007/8/6/1326286/Site.as
but i think its working as planned. but then again i might be doing something completely different.
August 8th, 2007 at 2:05 pm
Works for me except your fla gave me this error when published:
1180: Call to a possibly undefined method AccessibilityProperties.
I fixed it by importing the flash.accessibility.AccessibilityProperties; class but i couldn’t see why it was happening perhaps you know.
August 8th, 2007 at 2:20 pm
ahh thank you so much!!! i uploaded the wrong version but i wasn’t able to figure out how to fix that error message. thanks!!
i had to copy and paste everything over into a new document to get it to work…can you tell i’m new at this?
but overall does that preloader work as you intended it to or were you aiming for something different?
August 8th, 2007 at 2:38 pm
You know what it’s hard to say. It seems to me it will work ok for MovieClips but for any other custom classes you might have a problem.
I’ve updated your example so that the instance picture1 is now linked to a class. In the current state when the swf is run the picture1 instance will animate from left to right as defined in its class file picture1.as.
Notice this linked class is currently set to export in frame 1 (everything works fine like this right?). Now because we’re putting the linked class in frame 1 the preloader doesn’t work as expected because it bloats the size of frame 1.
We’re thinking ok lets just untick export in frame 1 and it will get placed at frame 3 your current export frame. Because it’s situated before the picture1 instance on the timeline you might think it would be ok but it’s not. I get a ‘TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::MovieClip@2e9f971 to tings.picture1’ error. This is where my example is different because it caters for linked classes.
August 8th, 2007 at 3:08 pm
so if its all exported on the first frame, won’t the first frame become bigger and bigger and the preloader will take longer to appear?
secondly i have a general question. what is the advantage to creating a package for picture1 and then importing it vs. just writing the actionscript within the main timeline/.fla file? and i also don’t understand lines 9-14 in the picture1.as file. sorry for all the questions, but i’m just having such a hard time finding individualized help anywhere on the internet.
August 8th, 2007 at 3:38 pm
Yes the first frame will become bigger which is what we are trying to avoid. I use linked custom classes in an effort to write better Object Oriented code. My example limits the size of frame 1 while still allowing stage instances to be linked to custom classes.
Your code does not achieve this so far as i can see.
To learn more about packages, linked classes and event handling (lines 9-14) i would recommend you get a decent AS3 book. My current favourite is Essential Actionscript 3 by Colin Moock.
August 9th, 2007 at 2:57 am
thanks for the suggestion, i’ve bought the book and started reading, it’s very helpful and indepth.
so as of right now, is there a way for to have the custom classes without expanding the first frame?
some suggestions (probably stupid but…)
1. import the class on the desired frame in actionscript in the main timeline.
2. use the addchild method in the document class
3. or possibly redesign the preloader (hopefully not)
are any of those logical/possible? just thoughts
August 9th, 2007 at 8:33 am
Yes export all your classes to a frame after the preloader.
You have to be careful not to reference any custom classes from your main document class ‘Site’. If you do they will automatically get exported in frame 1 regardless of your export settings because the document class needs to be able to reference them.
My document class ‘Site’ does reference a custom class ‘Nav’ which then references all the other custom classes ‘NavIcons’, ‘Icon’. Because of this Flash tries to export all the classes in frame 1. So to get around this problem i type Nav as a MovieClip (which Nav already inherits from and which is also a dynamic class – so no problems when Flash sees new properties and methods on this particular instance)
If you change this line in my Site class:
public var nav:MovieClip;
to
public var nav:Nav;
See what happens. That’s why i asked is this a hack and want to find out if there are any potential problems.
August 14th, 2007 at 10:12 pm
I find the best way to preload is to make a new FLA and load the main site into that.
August 15th, 2007 at 12:53 pm
Hi Tink,
I agree that in most cases i would do the same. Do you see any potential problems in my example that i may have overlooked?
August 17th, 2007 at 11:05 am
Not problems, just things i try to avoid.
1. you have to place items to be exported on to the stage.
2. i like to keep my root a single frame.
3. you have to change the ‘export of frame’ checkbox on all your items.
August 17th, 2007 at 4:52 pm
I like the ‘export to frame’ shortcut but often a lot of my stuff contains custom components (i’m already in the component definition window) so ticking a box usually doesn’t require too much extra effort.
Specifically for this example i wanted to be able to place my assets on the stage in advance so i could get a feel of the layout. I assume you’re doing the same but just within the loaded swf rather than the main container.
Do you always export to frame 1 in your loaded swf when using this type of setup?
April 24th, 2008 at 3:14 am
Hi, I got a question here:
I’m completely new to flash btw,
I’m trying to use a graphic as a button that will link to another frame in ActionScript 3.0.
Here is my code:
stop();
import flash.events.MouseEvent;
BlueButton.addEventListener(MouseEvent.CLICK,doClick);
function doClick(e:MouseEvent):void
{
gotoAndStop(10);
}
But when I test my movie, I get this error:
TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::SimpleButton@1c4ce7b1 to flash.display.MovieClip.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
What am I doing wrong?
Thanks!
August 17th, 2008 at 6:59 pm
Thanks a lot! This has been absolutely helpful. Though I get errors in the frame where I ve put the library items (export frame) – “ArgumentError: Error #1063: Argument count mismatch…”
The error doesnt really bother the functionality of the app but it d be nice if it didnt throw an error there. These are library items that have a class and when I paste them on stage, they are not initialized with the requisite arguments…
August 17th, 2008 at 7:14 pm
Ah… sorry to post again… I m not getting the error any more!
I just pushed the ‘export’ labeled frame to one frame after the frame with all the to-be-exported library items 🙂
September 8th, 2008 at 4:35 pm
Brandon !
Put this in your code
import flash.display.SimpleButton
you should also probably include this line,
import flash.display.*
for all the display classes. I advise reading up on it
Cheers
September 24th, 2008 at 2:50 pm
How to preload in AS3:
December 14th, 2008 at 4:26 pm
Thanks a ton! I used your preload for my current and first flash project. Just need to put the final touches on it…
http://www.screenulacra.at
February 17th, 2009 at 5:40 pm
Hai I have a doubt.How can we preload the external swfs The swfs appear when a button is clicked That is there should be only one preloader for every of the swfs which is listening for that click
Thanks for your time…
June 18th, 2009 at 12:16 pm
Hey, I too was having this concern and I like the way you did things.
Since you created this back in 2007, have their been any advances to the best way to load in classes?