-
How to write efficient actionscript? Any tips?
Hey guys.
I've been using flash for a good 7-8 months now, but i've always had a bit of a problem with writing efficient actionscript. Basically at the moment im just using a bunch of if else statements to execute all the "in" and "out" transitions of the site.
For example, (AS2.0)
aboutHit_mc.onRelease = function () {
if(currentPage != "about"){
//remove contents of current page
if(currentPage == "home"){
//use mask to hide contents of homepage
extAnimMask_mc.visible = true;
extAnimMask_mc.gotoAndPlay("_in");
box1Hit_mc.gotoAndStop("_off");
box2Hit_mc.gotoAndStop("_off");
box3Hit_mc.gotoAndStop("_off");
box4Hit_mc.gotoAndStop("_off");
contactU****_mc.gotoAndStop("_off");
requestAQuoteHit_mc.gotoAndStop("_off");
} else if(currentPage == "services"){
//close services page
servicesLoader_mc.extAnimMask_mc.gotoAndPlay("_out ");
services_mc.gotoAndPlay("_out");
} else if(currentPage == "portfolio"){
portfolioLoader_mc.extAnimMask_mc.gotoAndPlay("_ou t");
portfolioLoader_mc.navMask_mc.gotoAndPlay("_out");
portfolio_mc.gotoAndPlay("_out");
} else if(currentPage == "downloads"){
downloadsLoader_mc.extAnimMask_mc.gotoAndPlay("_ou t");
downloads_mc.gotoAndPlay("_out");
} else if(currentPage == "quote"){
quoteLoader_mc.extAnimMask_mc.gotoAndPlay("_out");
quote_mc.gotoAndPlay("_out");
} else if(currentPage == "contact"){
contactLoader_mc.extAnimMask_mc.gotoAndPlay("_out" );
contact_mc.gotoAndPlay("_out");
}
//load new page
mcLoader.loadClip("about.swf", aboutLoader_mc);
currentPage = "about";
//highlight about text on nav
about_mc.gotoAndStop(7);
extAnimMask_mc.visible = false;
}
}
This style or programming is making a lot of my work run quite slowly, so im keen to hear any advice on how to improve this. Im going to buy a couple of books on AS3 but for the next month or two im staying with AS2.
Any help would be greatly appreciated.
-
if you name your labels the same than the currentPage var, you would not even need if statements.
for example, you could replace:
Code:
if (currentPage == "home") {
box1Hit_mc.gotoAndStop("_off");
box2Hit_mc.gotoAndStop("_off");
box3Hit_mc.gotoAndStop("_off");
box4Hit_mc.gotoAndStop("_off");
}
with:
Code:
for (i=1; i<=4; i++) {
this["box"+i+"Hit_mc"].gotoAndStop(currentPage);
}
just by changing "_off" to "home"
for loops also help reducing the Number of lines, when dealing with serial named instances.
gparis
-
Thx gparis. So basically less code usually equals more efficient code? Do you think i should go back and rewrite all my code to fit in with your example? Would the performance savings be worth this given that my code is about 870 lines long atm? Im really keen to boost the frame rate of the site.
Also, does anybody else have any comments to make/links about actionscript efficiency?
-
14yr old Member
try using symbols like || and && or ** in between your state ments ill use
if(this.hitTest(_root.thing)) you can do this if(this.hitTest(_root.thing || _root.thing1)) that will be if it hits thing or thing1 the && is and and the ** is niether nor, meaning if this doesnt hit any of them
-
i can't seem to get the || and && conditional operators to work for me when im testing the current page variable. Any other tips i could use here?
-
14yr old Member
uhh sorry i doesnt seem to work for me either , i know these are operators and if i figure out how to use these ill tell you
-
Originally Posted by chur
Thx gparis. So basically less code usually equals more efficient code? Do you think i should go back and rewrite all my code to fit in with your example? Would the performance savings be worth this given that my code is about 870 lines long atm? Im really keen to boost the frame rate of the site.
Also, does anybody else have any comments to make/links about actionscript efficiency?
Yes. you should definitely re-write.
for a search on this topic, either here or at adobe, use the keyword 'optimise'
gparis
-
to get this to work, you would write it like this:
if(this.hitTest(_root.thing) || this.hitTest( _root.thing1));
you have to write out the whole statement again:
if (apples == 'green' || apples == 'red'){
//do this
}
if (apples == 'red' && type == 'Macintosh'){
trace('these are good');
}
IMS
-
All 1s and 0s
Hi,
You could further streamline this code by using the variable "currentPage" to point directly to the clip:
code:
this[currentPage + "Loader_mc"].extAnimMask_mc.gotoAndPlay("_out");
For instance, if currentPage == 'quote', this would evaluate to
code:
quoteLoader_mc.extAnimMask_mc.gotoAndPlay("_out");
Make any sense?
"If I have seen further, it is by standing on the shoulders of giants." - Sir Isaac Newton
-
Sweet, thx for the tips guys. Im going to try them out today.
-
Ok i managed to drastically optimise the code (thx guys ), but now im getting compiler errors. Does anyone know what's wrong with my syntax?
aboutHit_mc.onRelease = function () {
if(currentPage != "about"){
if(currentPage == "home"){
removeHomepage();
} else {
this[currentPage + "Loader_mc"].extAnimMask_mc.gotoAndPlay("_out");
this[currentPage + "_mc"].gotoAndPlay("_out");
}
//load new page
currentPage = "about";
loadExternalSwf(currentPage);
}
}
function loadExternalSwf(var page:String):Void { //error parameter name expected?
mcLoader.loadClip([page + ".swf"],[page + "Loader_mc"]);
this[page + "_mc"].gotoAndStop(7);
extAnimMask_mc.visible = false;
} //Unexpected '}' encountered
function removeHomepage():Void {
extAnimMask_mc.visible = true;
extAnimMask_mc.gotoAndPlay("_in");
contactU****_mc.gotoAndStop("_off");
requestAQuoteHit_mc.gotoAndStop("_off");
for (var i=1; i<=4; i++) {
this["box"+i+"Hit_mc"].gotoAndStop("_off");
}
}
Thx
-
Developing For Dunkets
change:
function loadExternalSwf(var page:String):Void {
to:
function loadExternalSwf(page:String):Void {
flash doesn't let you declare variables inside of function parameter fields. Declare the variable above all the code if you're feeling frisky, otherwise let it be.
-
Cheers mneil. It compiles sweet now. Only one more issue... I can't get the red line of code to load the external about.swf into the aboutLoader_mc movieclip. Everything else works sweet though.
function loadExternalSwf(page:String):Void {
mcLoader.loadClip(this[page + ".swf"],this[page + "Loader_mc"]);
this[page + "_mc"].gotoAndStop(7);
extAnimMask_mc.visible = false;
}
function removeHomepage():Void {
extAnimMask_mc.visible = true;
extAnimMask_mc.gotoAndPlay("_in");
contactU****_mc.gotoAndStop("_off");
requestAQuoteHit_mc.gotoAndStop("_off");
for (var i=1; i<=4; i++) {
this["box"+i+"Hit_mc"].gotoAndStop("_off");
}
}
aboutHit_mc.onRelease = function () {
if(currentPage != "about"){
if(currentPage == "home"){
removeHomepage();
} else {
this[currentPage + "Loader_mc"].extAnimMask_mc.gotoAndPlay("_out");
this[currentPage + "_mc"].gotoAndPlay("_out");
}
//load new page
currentPage = "about";
loadExternalSwf(currentPage);
}
}
Any ideas why the loadClip function won't accept my input?
-
Developing For Dunkets
you're using this in your loadExternalSwf which is refering to aboutHit_mc. So, unless aboutLoader_mc is located inside of aboutHit_mc, you'll need to change this to _root. Or, get rid of the [] and this all together on that line, and the next line you'll need to use root or else you'll get an error again. Because, right now what your saying is:
mcLoader.loadClip(aboutHit_mc[about.swf], aboutHit_mc[aboutLoader_mc]);
See what I'm saying?
It's usually a good practice to avoid _root, and there are ways to get around using it, but for this purpose using _root will most likely not cause any problems for you.
-
Thx man. I removed the [] and it works perfect .
-
Managed to decrease the code from 870 lines to 424 lines whilst keeping the same line spacing for both. Very happy with that. Need to optimise the external swf's now.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|