MTASCと戯れる その2 個々のムービークリップの生成 と 全体の構造

さて、init()で設定されたハンドラは二つあった。

mc.onEnterFrame = function(){  self.ef(); }
mc.onMouseDown =  function(){  self.md(); }

onMouseDownは明らかにマウスクリックしたときのハンドラなのでこちらを先に読もう。
mdはこう定義されている。

  function md()
  {
    var WAVC = 15 + Math.floor( drand(5) );
    var v0 = Stage.width * ( 0.01 + drand(0.01/2) );
    var d0 = Math.random()*7;
    var d1 = Math.random()*7;
    for( var t=0 ; t<WAVC ; ++t ){
      var c = createEMC();
      var d = d0+t*Math.PI*2/WAVC;
      draw_image( c, d1+d );
      c.v = { x:v0*Math.cos(d), y:v0*Math.sin(d) }
      c._x = mc._xmouse + c.v.x;
      c._y = mc._ymouse + c.v.y;
      mL.push( c )
    }
  }

動作から考えると、ここで星をいくつか生成しているはず。そう思って読むと、WAVC回数分繰り返すあからさまなループがあることに気がつく。
WAVCが生成する星の数でdrandという乱数メソッドで微妙に数を変えている。ループの中でその数分だけの星を生成していると見て間違いないだろう。とすれば、この15という数を書きかえてやれば星の数が変わるはず。15を3にしてみると、おお、ちゃんと数が減りました。でもクリックしても星が生成されない場合がでてきてしまった。バグぽい。なんでだ?とおもって、drandの定義を見てみると、こうなってた。

  static function drand( v )
  {
    return Math.random()*v*2-v;
  }

おー、つまり、drandは0からvの値を返すんじゃなくて、-vから+vまでの値を返すんですね。じゃあ3にすると、WAVCがマイナスになる場合があって星が生成されなかった、と。6にしてみたら、いいかんじになった。お、良くみるとこれstaticメソッドだ。ActionScriptではstaticメソッドもインスタンスメソッドからそのまま呼べるんだな。
でまあ、細かいところをとばしてみると、ここでは星の生成と速度の設定をやって、インスタンス変数mLに格納している。じゃああの動きはいったいどこでつけてるのだろう。コードの残りはもうonEnterFrameイベントに設定したハンドラしかない。そこで、onEnterFrameを調べてみた。

MovieClipのonEnterFrameイベントにメソッドを登録することでフレームごとに毎回処理を行うことが出来ます。

ビンゴです。Flashムービークリップは"フレーム"の連続なので、定期的に実行したい処理はonEnterFrameに登録しておけばよい、と。このソースでは、星の移動処理が定期的に行われる。ハンドラの中身を見てみよう。

  function ef()
  {
    var mLNext = new Array;
    var k = 0.1;
    var limop = 0.1;
    for( var i in mL ){
      (中略)
    }
    mL = mLNext;
    delete mLNext;
  }

ハンドラのほとんどは、mLの要素に対するforループ。mLってのは生成した星を登録しておく配列だったのでこの中で個々の動きの処理を書いている。最後のあたりを見ると、配列mLNextでmLを置きかえている。mLNextというのは次のステップまで生き残る星を登録する配列で、ループの中で登録しているんだろう。薄くなって消えた星はmLNextの中に登録されないので次の移動処理になったら消えている、と。

ま、ここまででひとおおりの動きはつかめた。最初の目標だった星の数と色の変更のうち、数は変更できたので、次は星の生成部分を詳しくみて色を変えてみよう。