About Flash Optimization

Working with flash and actionscript I often stumble upon bad and slow code (either old code of mine or written by others – designers); In this post I’ll try to list some resources worth knowing if you want to write fast and nice code.

Best Practices

  1. Do not use Objects, if you know which properties will be finally involved: dynamic properties are slow to read. Create custom classes instead.
  2. Strong type everything. If you think there is a reason to avoid strong typing, at least use * as type.
  3. Try out and test different strategies with Grant Skinner’s performance framework.

Resources

Feel free to suggest more :-)

Quickreference: flipping DisplayObjects

This one flips DisplayObjects on a vertical or horizontal axe.

public static function flipHorizontal(obj:DisplayObject):void {
    var m:Matrix = obj.transform.matrix;
    m.transformPoint(new Point(obj.width * .5, obj.height * .5));
    m.tx = (m.a > 0)?obj.width + obj.x:obj.x - obj.width;         
    m.a = -1 * m.a;
    obj.transform.matrix = m;
}
       
public static function flipVertical(obj:DisplayObject):void {
    var m:Matrix = obj.transform.matrix;
    m.transformPoint(new Point(obj.width * .5, obj.height * .5));
    m.ty = (m.d > 0)?obj.y + obj.height:obj.y - obj.height;
    m.d = -1 * m.d;
    obj.transform.matrix = m;
}

Sealed and dynamic classes

Back in the days of actionscript 2, you could add any property to pretty much any object, just calling it and setting a value, like this:

 myMovieClip.thePropertyILikeWithAStrangeName = "some string"

Actionscript 3.0 instead, being a more serious language, defines the basic class as sealed. That means that you can’t add any property on a object. You have to extends that class, and adding public properties.

public class MyClass extends MovieClip {
public thePropertyILikeWithAStrangeName:String
public function MyClass() {
super();
}
}

That class is sealed. You can’t

var foo:MyClass = new MyClass();
foo.anotherProperty = 42;

The dynamic keyword, permits to ‘unseal’ a class, giving back the possibility to add any property on runtime.

public dynamic class MyClass extends MovieClip {
public thePropertyILikeWithAStrangeName:String
public function MyClass() {
super();
}
}

Now you can:

var foo:MyClass = new MyClass();
foo.anotherProperty = 42;

There are speed and cleaness drawbacks on using dynamic classes. The rule is that if you use it, you should be able to seriously motivate it.

Note that there are few dynamic classes in the default Actionscript framework; the most known is of course, Object .

Read more:
livedocs
ActionScript 3: Dynamic Classes

Basic random functions

Here are some really basic (but useful) functions that returns random stuff…

The really basic one, is built in the Flash api and it returns a Number between 0 and 1:

var n:Number = Math.random();

A number in  a range

Sometime is more useful to have a random number in a different range, let’s say between 15 and 45, instead of 0 and 1.

public static function randNumber(max:Number = 1, min:Number = 0):Number {
    return Math.random() * (max - min) + min;
}

Random int

and what if we don’t need decimals? Round’em!

public static function randInt(max:Number = 1, min:Number = 0):int {
    return Math.round(Math.random() * (max - min) + min);
}

Random boolean

True or false? Flip a coin.

public static function bool():Boolean {
    return (Math.round(Math.random()) == 0);
}

Random sign

-1 or 1; Useful when you have to random select random rotation verse, for example, -1*45 or 1*45, rotates counterclockwise or clockwise.

public static function sign():Number {
    return (Math.round(Math.random()) == 0):-1:1;
}

Random color

Really useful when drawing debug shapes on screen..

public static function color():uint {
    return Math.random() * 0xFFFFFF;
}

Random point

Inside an area. I like to use the flash.geom.Rectangle struct to describe an area, more than using 4 parameters (Flash api are quite inconsistent about this choice)

public static function point(area:Rectangle):Point {
    return new Point(randInt(area.x, area.x + area.width), randInt(area.y, area.y + area.height));
}

Quickreference: display elements in a circle

How to display elements in a circle? A small function to do that is:


GeSHi Error: GeSHi could not find the language actionscript3 (using path /nfs/c03/h01/mnt/85630/domains/nightdrops.com/html/wp-content/plugins/snipplr/geshi/geshi/) (code 2)

Parameters are:

  • items: the items to be displayed a a circle
  • center: the center of the circle
  • distance: the distance from the center
  • initialAngle: the angle of the first item. Zero means that the item wil be aligned orizontally with the center, on his right.

Here’s an example: