[as3]大量のムービークリップを一度に処理する方法(EventDispatcher)

始めまして、冨田です。
これからこのブログでActionScript 3.0の便利な機能を紹介させていただきます。

今回紹介するのはEventDispatcherです。

ますは、このサンプルを見てください。
※画面の好きな場所をクリックしてください。

さて皆様、大量にあるムービークリップ全てに
同じ動きをさせるためにこんな書き方をしていませんか?

stage.addEventListner(MouseEvent.CLICK,mc_move);
function mc_move(ev:MouseEvent){
  mc1.x = 100;
  mc2.x = 200;
  mc3.x = 300;
  mc4.x = 300;
  ……
  …
}

これくらいの数なら手で書いても良いのですが
これが100個200個になると手で書くのは大変ですし非効率ですよね。

そんな時に便利なのがEventDispatcherとカスタムクラスの組み合わせです。

EventDispatcherとは
大量のイベント送出先に一発でイベントを送出したり
ムービーが全て終わったことを伝えたりといろいろできます。

では、ステージをクリックすると一斉に起立、着席をする
簡単なスクリプトを書いて見ましょう。

まず、下記画像のようにムービークリップを作ってください。

次にステージ上にダイナミックテキストを作ります。
インスタンス名はtextにしてください。

次にメインタイムライン上に下記コードを書きます。

//ステージをクリックすると_onClickを実行
stage.addEventListener(MouseEvent.CLICK, _onClick);
//変数standupに"着席!"を代入
var standup:String = "着席!"

function _onClick(ev:MouseEvent):void{
  //"event"が登録されているイベントを実行
  dispatchEvent(new Event("event"));

  /*下記は条件演算子です。standupが"着席!"ならstandupを"起立!"に
  standupが"着席!"でないならstandupを"着席!"にしろという意味です*/
  standup == "着席!" ? standup = "起立!" : standup = "着席!";
  text.text = standup;
}
//インスタンスの生成、配置とイベントの登録
function init(){
  for(var i:int=0; i<10; i++){
    var mc:Clip = new Clip();
    mc.x = i * 50 + 50;
    mc.y = 150;
    addChild(mc);
    //dispatchEventで登録した"event"を実行します
    addEventListener("event", mc._Event);
 }
}
//関数init()を実行
init();

次にasファイルを作り下記コードを書いてください。

package {
  import flash.display.MovieClip;
  import flash.events.Event;
  public class Clip extends MovieClip{
    //Clipクラスのコンストラクタです
    function Clip ():void {}
    public function _Event(ev:Event):void{
      //変数frameに現在のフレームを代入
      var frame:int = currentFrame;
      //frameが1ならframeを2にframeが1でないならframeを1にします。
      frame == 1 ? frame = 2 : frame = 1;
      //変数frameに入っている数字のフレームへ飛びます
      gotoAndStop(frame);
    }
  }
}

クラスファイルが完成しましたら

一番上で作ったムービークリップのリンケージに

クラスファイルの名前を入力してください。

ファイルの構成はこんな感じです。

これで準備完了です。

どうでしょうか?ステージをクリックしたら
机に座った人が起立しましたか?

これを使えばインスタンスを大量に使用する
シューティングゲームの玉を一斉に止めるポーズ機能のなどで使えるのではないでしょうか?
使える機会がありましたら、ぜひ使用してみてください。

今回のサンプルです。EventDispatcher

冨田