- 2007年11月13日 12:28
- ActionScript 3.0
前回の日記で、AS3でonEnterFrameをどうやるかを
Eventの実装方法を含めて話しましたが
今回は自分でイベントを定義してみようと言う話です。
これがまた出来るとやたら気持ち良いです。
基本的な流れは
独自Eventを定義 → dispatchEvent → addEventListener
という感じです。
サンプルは こちら ※ flaファイルを開くにはFlashCS3が必要です。
それでは、解説をしていこうと思います。
Eventの実装方法を含めて話しましたが
今回は自分でイベントを定義してみようと言う話です。
これがまた出来るとやたら気持ち良いです。
基本的な流れは
独自Eventを定義 → dispatchEvent → addEventListener
という感じです。
サンプルは こちら ※ flaファイルを開くにはFlashCS3が必要です。
それでは、解説をしていこうと思います。
今回は MovieClip から発生するイベントを定義し、それが発生したときには
その MovieClip への参照を取得できるというようなクラスを考えます。
実際にそのようなEventクラスを作るときには
以下のような記述になります。
package {
// Eventクラスを継承するので import する.
import flash.events.Event;
// 内部で使うので import する.
import flash.display.MovieClip;
public class MovieClipEvent extends Event{
/** イベント名の定義 ( Event.ENTER_FRAME 的なもの ) */
public static const CHANGE_SCALE:String = "_changeScaleEvent";
/** 実行回数を保持する static 変数 */
private var _mc:MovieClip;
/**
* コンストラクタ.
* @param type
* @param bubbles = false
* @param cancelable = false
*/
public function MovieClipEvent( type:String, bubbles:Boolean = false, cancelable:Boolean = false ){
super( type , bubbles , cancelable );
}
/**
* MovieClipへの参照を取得する.
* @return _mc
*/
public function getMovieClip():MovieClip{
return _mc;
}
/**
* MovieClipへの参照を保持する.
* @param mc
*/
public function setMovieClip( mc:MovieClip ):void{
_mc = mc;
}
}
}
これでMovieClipEventクラスは完了です。実際に使う時は以下のようにして使います。
今回は MyMovieClip という MovieClip を継承したクラスを定義し
その中で定義した changeScale という関数が呼ばれた時に
このイベントが発生するようにしたいと思います。
まずはクラスの実装です。
package{
// import するクラス群.
// もしイベントを別パッケージで定義した場合には適宜 import して下さい.
// 今回は同一パッケージのため import はありません.
import flash.display.MovieClip;
public class MyMovieClip extends MovieClip{
public function changeScale( scale:Number ):void{
// スケールを変更.
scaleX = scale;
scaleY = scale;
// イベントの生成.
var event:MovieClipEvent = new MovieClipEvent( MovieClipEvent.CHANGE_SCALE );
// イベントにこの MovieClip への参照を保持させる.
event.setMovieClip( this );
// イベントを通知する.
dispatchEvent( event );
}
}
}
これでイベントを通知する仕組みが出来ました。あとはこいつに前回同様 addEventListener して、ハンドラを登録するだけです。
// MyMovieClipのインスタンスを作成.
var myMC:MyMovieClip = new MyMovieClip();
myMC.addEventListener( MovieClipEvent.CHANGE_SCALE, _onChangeScale );
// stageに追加する
addChild( myMC );
// CHANGE_SCALE のイベントハンドラ.
function _onChangeScale( evt:MovieClipEvent ){
// イベントが起きた MovieClip を取得.
var mc = evt.getMovieClip();
trace( myMC == mc ); // true
}
これで、myMC.changeScale(); が実行された際に_onChangeScale 関数が実行され、出力ウィンドウに true と表示されます。
説明があまりうまくなくて便利さが伝わらないかもしれませんが
うまく使うと非常に便利かつ綺麗にイベント実装を進めていけます。
ぜひ一度お試しを。
- Newer: PDFを「名前を付けて保存」させるための設定
- Older: robots.txtの記述