入れ子のムービークリップのマウスイベント currentTarget

|
(section04-02 イベントとイベントリスナーから抜粋)

 ムービークリップの中にさらにムービークリップが含まれているという入れ子のムービークリップのインスタンスの場合には、マウスイベントを受け取ったターゲットの処理に注意が必要です。
 たとえば、次のカエルの顔のムービークリップは顔の中の目が入れ子のインスタンスになっています。このムービークリップのインスタンスface_mcにクリックすると回転するイベントリスナーを追加します。

fig04-02-04.jpg
顔のムービークリップの中に目のムービークリップが入れ子で入っています。

[:script:]クリックしたtargetを回転させる
//イベントリスナーの追加
face_mc.addEventListener(MouseEvent.CLICK, onClick);

//クリックのリスナー関数
function onClick(eventObj:MouseEvent):void {
	var target_mc:MovieClip=eventObj.target as MovieClip;
	target_mc.rotation+=30;
}
 カエルの顔すなわちface_mcをクリックすると顔全体が回転します。つまり、targetはface_mcということになります。

fig04-02-05.jpg
顔をクリックすると顔全体が回転します。

 ところが、目をクリックすると目だけが回転します。目のインスタンスにはイベントリスナーを登録していないのに、クリックのtargetはface_mcではなく目のインスタンスになっています。

fig04-02-06.jpg
目をクリックすると目だけが回転します。
swfを試す

 目をクリックしても顔全体を回転させるには、targetプロパティではなくcurrentTargetプロパティを利用します。

[:script:]リスナーを追加したインスタンスを回転させる
//イベントリスナーの追加
face_mc.addEventListener(MouseEvent.CLICK, onClick);

//クリックのリスナー関数
function onClick(eventObj:MouseEvent):void {
	var target_mc:MovieClip=eventObj.currentTarget as MovieClip;
	target_mc.rotation+=30;
}
swfを試す

targetとcurrentTarget
 targetはその名の通りイベントが発生したターゲットを指しますが、currentTargetはリスナー関数を処理中のインスタンスを指します。この違いを次のサンプルで確認してみましょう。

[:script:]親と子のムービークリップをイベントリスナーに追加する
//親ムービークリップ
colors_mc.addEventListener(MouseEvent.CLICK, clickParent);
//子ムービークリップ
colors_mc.red_mc.addEventListener(MouseEvent.CLICK, clickChild);
colors_mc.blue_mc.addEventListener(MouseEvent.CLICK, clickChild);
//親ムービーのリスナー関数
function clickParent(event:MouseEvent):void {
	trace("---親ムービー");
	trace("target= "+event.target.name);
	trace("currentTarget= "+event.currentTarget.name);
}
//子ムービーのリスナー関数
function clickChild(event:MouseEvent):void {
	trace("---子ムービー");
	trace("target= "+event.target.name);
	trace("currentTarget= "+event.currentTarget.name);
}
fig4-02-07.jpg
 子ムービーのインスタンスred_mcをクリックすると、出力ウィンドウには次のように書き出されます。

fig4-02-08.jpg

 この結果から次の3つのことがわかります。まず1つ目として、clickParent()とclickChild()の両方が実行されていることから、子ムービーのインスタンスred_mcをクリックするとクリックイベントがred_mcだけでなく親ムービーのcolors_mcにも通知されていることがわかります。
 2つ目はリスナー関数が実行される順番です。出力の順番から子ムービー、親ムービーの順でリスナーに通知されています。
 3つ目はtargetとcurrentTargetの値の違いです。targetの値はどちらともクリックしたred_mcを指しますが、currentTargetの値は処理中のリスナー関数が追加されているインスタンスを指しているのがわかります。

[:note:]ムービークリップに限らず入れ子構造の表示オブジェクトコンテナのすべてに同じ事が言えます。
まったく新しいAS3の世界!
694a.jpg
Adobe Flash CS4
詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)

楽しいActionScript。
新たなる1歩へと踏み出しましょう。
■内容は?→ 目次を見る
■評判は?→ 書評を読む
この本を書いたわけ

このブログ記事について

このページは、oshigeが2009年10月 3日 15:10に書いたブログ記事です。

ひとつ前のブログ記事は「Adobe EDGEで連載開始」です。

次のブログ記事は「入れ子のムービークリップのロールオーバー/ロールアウト」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたいブログパーツ