EventDispatcher
[おさらい]上のページより
パッケージ flash.events
クラス public class EventDispatcher
継承 EventDispatcher → Object
実装 IEventDispatcher
サブクラス 省略
この部分を私的解釈すると、
flash.eventsというフォルダにEventDispatcherクラスが入っていますよ。
このクラスは、Ojectクラスの機能を備えており、IEventDispatcherインターフェイスのメソッドが使えますよ。
このクラスを継承しているクラスはサブクラスの欄を見てね。
って感じかなw
で、注目すべきは、以下のメソッド。
イベントターゲット.addEventListener(イベントタイプ, リスナー関数名);
//リスナー関数
function 関数名(イベントオブジェクト:イベントタイプ):void{
//処理;
}
//削除
イベントターゲット.removeEventListener(イベントタイプ, リスナー関数);
【イベントターゲット】
イベントが発生するオブジェクト
【イベントタイプ】
感知するイベントの種類
【リスナー関数】
イベントが発生したときに実行する処理を書いた関数
まぁ、イベントリスナー自体は、2.0と変わりなさそうなので割愛。
要はイベントタイプだな。
ボタン処理で使うのは、MouseEventに書かれてあるパブリック定数。
_mc.addEventlistener(MouseEvent.CLICK, myFunc);
といった感じで使う。
CLICK : String = "click"
こんな感じで書いてあるのは、MouseEvent.CLICKと書かなくても、"click"だけでOKってこと。
次は、リスナー関数について。
リスナー関数に、どういうイベントが発生したか、イベントの内容が渡されるので、これを受け取るために引数が必要。
引数は、イベントタイプと同じデータ型にする。
イベントを受け取って、処理を実行するわけだが、何に対して処理をするか?というターゲットを、イベントターゲットにしたいというケースは割りと多いと思う。
例えば、mc1をクリックするとmc1が回転するなどといった場合、mc1を直接ターゲット指定してもいいんだけど、mc2をクリックしたらmc2が回転、mc3をクリックしたら〜といった場合、イベントターゲットをターゲット指定すれば、リスナー関数は1つで済む。
イベントターゲットをターゲットに指定する方法
mc1.addEventLitener("click", myFunc);
function myFunc(eventObj:MouseEvent):void{
var target:MovieClip = eventObj.target as MovieClip;
target.rotation += 20;
}
【as演算子】データ型が一致したときに、その値を返す。
イベントターゲットがムービークリップの場合は、MovieClipにする。
ボタンの場合は、DisplayObjectになる。(Button廃止なのねー;;)
しかし、イベントターゲットが入れ子の場合は、イベントタイプによって挙動が違うのでややこしい。
【クリックの場合】
親mcのなかに、もう一つムービークリップ(子mc)が入っていて、親mcに先程のクリックで回転するイベントリスナーを付けた場合、子mcをクリックをクリックすると、子mcだけが回転する。
つまり、子もイベントを感知しちゃってるわけだ。
これを、子mcをクリックしても親mcが回転するようにしたい場合、
var target:MovieClip = eventObj.currentTarget as MovieClip;
targetではなく、currentTargetにすると、親だけ回る。
或いは、マウスイベントを感知する子はいませんという設定をする。
mc1.mouseChildren = false;
【mouseChildren】
flash.display.DisplayObjectContainerクラスで定義されているプロパティ
オブジェクトの子に対してマウスが有効かどうかを調べる。
【ダブルクリックの場合】
ダブルクリックの場合は、入れ子でなくても、とりあえず、ダブルクリックのイベントを受け取る設定をしなくてはいけない。
mc1.doubleClickEnabled = true;
入れ子の場合は、子の上でダブルクリックすると無視される。
子をダブルクリックしても無反応だけど、どうやらイベントは感知している模様。
doubleCliclEnabledを子にも設定すればいいんだけど、子が多い場合は効率が悪いので、「マウスイベントを受け取る子はいません」って設定を親に対して行う。
mc1.mouseChildren = false;
ダブルクリックのスクリプトまとめ
mc1.doubleClickEnabled = true;
mc1.mouseChildren = false;
mc1.addEventListener("doubleClick", myFunc);
function myFunc(eventObj:MouseEvent):void{
var target:MovieClip = eventObj.target as MovieClip;
target.rotation += 20;
}
【ロールオーバー/ロールアウトの場合】
入れ子の場合、子はtargetとして処理できないので、マウスが子に触れても親がターゲットになる。
子をターゲットに設定したい場合、つまり、親に触れると子が回転するといった処理の場合、addEventListener()の第3パラメータuseCaptureプロパティをtrueに設定する。
mc1.addEventListener("rollOver", myFunc, true);
function myFunc(eventObj:MouseEvent):void{
var target:MovieClip = eventObj.target as MovieClip;
target.rotation += 20;
}
でも、これだけだと、孫まで回転してしまう。
なので、ダブルクリックで使ったmouseChildrenプロパティを子に設定する。
mc1.mc1_child.museChildren = false;