(AS2)EventDispatcherとAsBroadcasterの違い

2008/07/13

iPhone出ましたね。twitter見てるとなんか盛り上がっている感じが伝わってきますよ。

——–以下どうでもいい話
それで、iPod touchとかも詳しく知らなかったんですが、アップルのサイトの動画を見てだいたい機能がわかりました。感想としては、「携帯の時代が来るのは、本当くさいな…。」というところです。デスクトップ端末から、携帯端末にシフトしていくみたいな流れがネット界隈ではささやかれているのを、知っていました。でも、正直なところ「あんなちっこい画面で何ができるんだYo。You教えちゃいなよ!」みたいな感じでした。ところが、あのキー入力とか(ボタン押して十字スライドとか感動した!)指でビヨンと拡大とか、ソフトが無料で誰でも開発できるとか(利益出そうとすると金かかるケド)なんかすごいですね。

デスクトップは業務用で、携帯はプライベート用。というすみ分けが今後進んでいきそうです。そうすると、Flashもデスクトップ用は業務用アプリ。携帯用はFlash Liteを使った広告案件とかが増えていくんでしょうかね。

私は携帯あんまり使わないんで、いまだにVodafoneだったりするんですが、この間「来年であんたの携帯使えなくなるから、早く変えといてね!」という、立ち退きお知らせハガキがソフトバンクからきている状態です。これは私にiPhone買えというお告げなんでしょうか?でも、普段ずっと自宅でPC動かしている私は業務が絡まない限りiPhoneが必要になるはずもなく、、。どうしよう?
———

さて、ムダ話が終わったところで今日の本題です。現在AS2をわけあって勉強しなおしているわけですが、今日はEventDispatcherとAsBroadcasterの違いを勉強しました。なんかAS3から周回遅れというより、巻き戻しの発掘調査という気分です。

■EventDispatcher
バージョン2コンポーネントを使用する。ので、これだけ使う場合でもライブラリにバージョン2コンポーネントが入ってないと気付かないエラーが出るとどこかで読んだ。(DepthManagerのところにそんな記述があったから、これもきっとそうなんじゃないかな?)だからButtonコンポーネントとか配置しとかないとだめだと思う。
■AsBroadcaster
コンポーネントじゃないので、特に何か追加する必要はなし。

両者の違いはよくわかんないけど、文法が違う。

■参考) ありがとうございます。
AsBroadcasterクラスを使ってみるのだ!
EventDispatcherを使ってみる (1)
AsBroadcaster, EventDispatcher, OnEnterFrameBeacon, FuseKitを使うときに大体始めに書く事メモ
EventDispatcherについてのメモ
あと、何より参考になったのが、われらがAdobeのhelpリファレンスですね。

■文法の違い

ソースコードです。
■AsBroadcasterのサンプル

class AsBroadcasterSample
{
  private var asb_obj:Object;
  private var asbLis_obj:Object;
  private var asbLis_obj2:Object;

  public function AsBroadcasterSample()
  {
    initialize();
  }

  private function initialize():Void
  {
    var self:AsBroadcasterSample = this;

    //リスナーオブジェクト作成
    asbLis_obj = new Object();

    //ひとつのリスナーオブジェクトで、違うイベントハンドラを登録する
    asbLis_obj.myEvent1 = function(arg1, arg2)
    {
      self.setText([arg1, arg2].toString());
    };
    asbLis_obj.myEvent2 = function(arg1, arg2)
    {
      self.setText([arg1, arg2].toString());
    };

    //外の関数を呼ぶ + 同じイベントハンドラで違う関数を呼ぶ
    asbLis_obj2 = new Object();
    asbLis_obj.myclick = function(arg1, arg2){ self.myclickHandler(arg1, arg2); }
    asbLis_obj2.myclick = function(arg1, arg2){ self.myclickHandler2(arg1, arg2); }

    //呼ばれた先の関数で、class内のインスタンスメンバを呼ぶ必要がない場合はこちら
    //asbLis_obj.myclick = myclickHandler;
    //asbLis_obj2.myclick = myclickHandler2;

    //初期化 + イベント登録
    asb_obj = new Object();
    AsBroadcaster.initialize(asb_obj);
    asb_obj.addListener(asbLis_obj);
    asb_obj.addListener(asbLis_obj2);

    //イベントトリガ
    _root.mc2.onPress = function()
    {
      _root.log_txt.text = ">>mc2.onPressnn";

      //第二引数以降はサンプルの引数
      self.asb_obj.broadcastMessage("myEvent1", 10, "mystring1");
      self.asb_obj.broadcastMessage("myEvent2", 20, "mystring2");
      self.asb_obj.broadcastMessage("myclick", 30, "mystring3");
    };
  }

  private function myclickHandler(arg1, arg2):Void
  {
    setText("myclickHandler: " + [arg1, arg2]);
  }

  private function myclickHandler2(arg1, arg2):Void
  {
    setText("myclickHandler2: " + [arg1, arg2]);
  }

  private function setText(str:String):Void
  {
    _root.log_txt.text += str + "n";
  }
}

■EventDispatcherのサンプル
※はじめにimportするところと、flaのライブラリにバージョン2コンポーネントを入れておいた方がよいかと。

import mx.events.EventDispatcher;

class EventDispatcherSample
{
  private var ed:EventDispatcher;
  private var edLis_obj:Object;

  public function EventDispatcherSample()
  {
    initialize();
  }

  private function initialize():Void
  {
    var self:EventDispatcherSample = this;

    //初期化
    ed = new EventDispatcher();

    //リスナーオブジェクト作成
    edLis_obj = new Object();

    //ひとつのリスナーオブジェクトで、違うイベントハンドラを登録する
    edLis_obj.myEvent1 = function(e:Object)
    {
      self.setText([e.type, e.arg1, e.arg2].toString());
    }
    edLis_obj.myEvent2 = function(e:Object)
    {
      self.setText([e.type, e.arg1, e.arg2].toString());
    }
    ed.addEventListener("myEvent1", edLis_obj);
    ed.addEventListener("myEvent2", edLis_obj);

    //外の関数を呼ぶ + 同じイベントハンドラで違う関数を呼ぶ
    ed.addEventListener("myclick", myclickHandler);
    ed.addEventListener("myclick", myclickHandler2);

    //イベントトリガ
    _root.mc.onPress = function()
    {
      _root.log_txt.text = ">>mc1.onPressnn";

      //Obejectの中の第二項以降はサンプルの引数
      self.ed.dispatchEvent({type:"myEvent1", arg1:10, arg2:"mystring1"});
      self.ed.dispatchEvent({type:"myEvent2", arg1:20, arg2:"mystring2"});
      //呼ばれた先の関数で、class内のインスタンスメンバを呼ぶ必要がない場合はscopeはいらない
      self.ed.dispatchEvent({type:"myclick", scope:self, arg1:30, arg2:"mystring3"});
    };
  }

  private function myclickHandler(e:Object):Void
  {
    e.scope.setText("myclickHandler: " + [e.type, e.arg1, e.arg2]);
  }

  private function myclickHandler2(e:Object):Void
  {
    e.scope.setText("myclickHandler2: " + [e.type, e.arg1, e.arg2]);
  }

  private function setText(str:String):Void
  {
    _root.log_txt.text += str + "n";
  }
}

■まとめ
細かいところでいろいろと違うと思う。
addEventListenerとaddListenerとか、引数の持たせ方とか。詳しくはソースコードを見てもらえるとよいかと。
それで、AS2にはDelegateっていうクラスがあるみたいだけど、サンプルみたいに参照をわたしてあげると必要ないんじゃないかな?というのが結論なんですが、詳しいことは私にはわかりません。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る