Или вот такая авантюра:
Код AS3:
import flash.display.Bitmap;
import flash.geom.Matrix;
import flash.display.BitmapData;
// Оригиналы листьев.
var origs:Array = [];
origs[0] = new Leaf1();
origs[1] = new Leaf2();
origs[2] = new Leaf3();
// Текущий вид каждого из трех вариантов листьев.
var leafs:Array = [];
leafs[0] = new Leaf1();
leafs[1] = new Leaf2();
leafs[2] = new Leaf3();
// Чтобы матрицы каждый раз не создавать заново.
var mtx:Matrix = new Matrix();
// Наша импровизированная крона дерева о тысяче листов.
var leafsNum:int = 1000;
var tree:Array = [];
// Создаем дерево.
var leaf:Bitmap;
for (var i:int = 0; i < leafsNum; i++) {
leaf = new Bitmap(leafs[int(Math.random() * 3)]);
leaf.x = Math.random() * 400 + 50;
leaf.y = Math.random() * 250 + 50;
addChild(leaf);
tree[i] = leaf;
}
// Это у нас разные фазы для каждой группы листьев.
var phases:Array = [0.0, 1.1, 1.6];
// А это общее "время".
var time:Number = 0.0;
// Поехали!
addEventListener(Event.ENTER_FRAME, onEnterFrame);
// Ну вот, собственно, и вся магия. Здесь мы меняем
// всего лишь три битмапдаты, которые размножены на экране
// посредством тысячи битмап. Ну, т.е. мы не каждый лист
// перерисовываем, а лишь три его варианта отображения.
// Остальное происходит типо блиттингом.
function onEnterFrame(event:Event):void {
time += 0.2;
var r:Number;
var s:Number;
var b:BitmapData;
for (var i:int = 0; i < 3; i++) {
r = (Math.sin((time + phases[i]) * 0.2) + Math.sin((time + phases[i]) * 0.5) + i - 1.5) / 10;
s = i * 0.2 + 0.6;
mtx;
mtx.identity();
mtx.translate(-32, 0);
mtx.scale(s, s);
mtx.rotate(r);
mtx.translate(32 * s, 0);
b = leafs[i] as BitmapData;
b.fillRect(b.rect, 0);
b.draw(origs[i] as BitmapData, mtx, null, null, null, true);
}
}