2004/04/23
星 鉄矢(http://www.javac.jp)

ActionScript2.0で作るフラクタル(Fractal) - レジスタークラス

再帰処理を行うには、何通りかの方法があると思いますが、今回用いているのは、FlashMX2004におけるレジスタークラスです。実際には、リンケージdragon, snow, jaggyに対し、LineClassを継承したクラスDragonClass, SnowClass, JaggyClassをレジスタークラスしています。これにより、attachMovieされたムービークリップはそれぞれ特有に拡張されたムービークリップとして挙動します。
TaskManagerクラスにより実行されていくのは、LineClassクラスのcreateChildメソッドです。これらは、DragonClass, SnowClass, JaggyClassでオーバーライドされて実行されています。例としてDragonClassをとると、

var linkage:String="dragon";
var mcname:String="line"+String(depth);
this.attachMovie(linkage,mcname,depth);
depth++;
var mc:MovieClip=this[mcname];
mc.setStatus(obj);
mc.setTaskManager(taskManager);
mc.reflectPosition();
まず、対象となるムービークリップを生成し、次に再帰的に行うメソッドをTaskManagerに登録していきます。
行うメソッドは、まず、子供を生成する前に自分のラインを見えなくして、次に子供を生成していきます。ここで気を付けなければならないことは、親の_visibleがfalseになると、その下の階層の子供全ても見えなくなってしまうことです。そこで、これらのムービークリップは内部に絵の対象となる線を持っておき、その絵の_visibleのみfalseにします。これにより、ムービークリップのツリー構造は_visibleをtrueに保つことができます。
var method:String="setVisual";
var target:MovieClip=mc;
var obj:Object=new Object();
obj.flag=false;
taskManager.addTask(method,target,obj);

var method:String="createChild";
var target:MovieClip=mc;
var obj:Object=new Object();
obj.cx=0;
obj.cy=0;
obj.len=50;
obj.rot=-60;
taskManager.addTask(method,target,obj);

...

(1)    (2)    (3)    (4)    (5)