2010年07月01日

ボタン処理

AS3.0では、イベントリスナーを使う。
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;




posted by K at 12:52| Comment(0) | スクリプト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。