EventDispatcherを使ってみる (3)

EventDispatcherクラスを使ってみるのだ! :boy:

謎の呪文をさらに唱えてみる。 :sign:

This movie requires Flash Player 9.0.0

EventDispatcherクラスは、ブロードキャスターからリスナーへイベントを配信する仕組み。つまり、ブロードキャスターは送り手で、リスナーが受け手だ。

Object をブロードキャスターやリスナーにすることができるということは、MovieClip だってブロードキャスターやリスナーにすることができるはず。 :hakase:

ということで…。
frog, child をブロードキャスターに、_root をリスナーにしてみる。


_root にボタン(インスタンス名: startBtn, resetBtn) を配置。
また、ムービークリップ(インスタンス名: frog1, frog2, child1, child2) も配置。

frog1, frog2 第1フレームに
function jump():Void {
  // ジャンプする動き
  (中略)

      delete this.onEnterFrame;
      this._parent.dispatchEvent({type: "eventComplete"});

  (中略)
}
function swingHead():Void {
  // 首を振る動き
}
と記述。

child1, child2 第1フレームに
// child1 の場合
var childID:Number = 1;
var passed:Boolean = false;

function initPos():Void {
  // スタート地点にもどる
  this._x = 50;
  passed = false;
}
function run():Void {
  // 移動する動き
  var baseSpeed:Number = 2;
  var randomSpeed:Number = 2;
  this.onEnterFrame = function():Void {
    var speed:Number = baseSpeed + Math.random()*randomSpeed;
    this._x += speed;
    if (!passed && this._x >= 250) {
      passed = true;
      this.dispatchEvent({type: "passPoint", child: childID});
    }
    if (this._x >= 450) {
      this._x = 450;
      delete this.onEnterFrame;
      this.dispatchEvent({type: "reachGoal", child: childID});
    }
  };
}
と記述。

_root 第1フレームに
var goaled:Boolean = false;

import mx.events.EventDispatcher;

EventDispatcher.initialize(frog1);
EventDispatcher.initialize(frog2);
EventDispatcher.initialize(child1);
EventDispatcher.initialize(child2);


function passPoint(eventObj:Object):Void {
  var childID:Number = eventObj.child;
  this["frog"+childID].swingHead();
}
function reachGoal(eventObj:Object):Void {

  var childID:Number = eventObj.child;
  if (!goaled) {
    goaled = true;
    this["frog"+childID].jump();
  } else {
    this["frog"+childID].swingHead();
  }
}
function eventComplete():Void {
  resetBtn.enabled = true;
}

child1.addEventListener("passPoint", this);
child2.addEventListener("passPoint", this);
child1.addEventListener("reachGoal", this);
child2.addEventListener("reachGoal", this);
frog1.addEventListener("eventComplete", this);
frog2.addEventListener("eventComplete", this);


resetBtn.enabled = false;
startBtn.onRelease = function():Void {
  this.enabled = false;
  child1.run();
  child2.run();
  frog1.swingHead();
  frog2.swingHead();

};
resetBtn.onRelease = function():Void {
  goaled = false;
  this.enabled = false;
  startBtn.enabled = true;
  child1.initPos();
  child2.initPos();

};
と記述。

これで、子かえるが中間点を通過したときに、passPoint というイベントがブロードキャスト(通知/配信)されて、引数として渡されるイベントオブジェクトに追加定義した、child というプロパティの値に応じて、親かえるが首を振る。

また、子かえるがゴールに到達したときに、reachGoal というイベントがブロードキャスト(通知/配信)されて、引数として渡されるイベントオブジェクトに追加定義した、child というプロパティの値に応じて、親かえるがジャンプするか首を振るかする。


やたー! :doki:

でも、ブロードキャスターが複数あって、イベントごとに処理するので、煩雑なスクリプトになっている気もする。今回の場合は、ブロードキャスターは Object にした方がいいのかも。 😮