AS3でカスタムイベント

Flash開発する上ではイベントの処理は必要ですよね。 僕はFlashを勉強し始めて、二週間ちょっとですが、もう何回使ったかわかりません。 そのくらい頻繁に用いるイベント処理。 ゲームを制作する時とかは自分でイベントを作りたくなります。 「着地した瞬間」とか「的に当たった瞬間」とか「ゴール地点に到達した瞬間」とかね。 今日、カスタムイベントの定義の方法を勉強したので、復習を込めた備忘録です。

カヤックのブログの説明がよかったです。

今回作成したサンプルです。

壁にボールが当たるとイベントが発生します。

【Main.as】

メインのクラス


package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* 円をクリックすれば、ステージを円が跳ね返っていく
* 跳ね返った瞬間にイベントディスパッチする
*/
public class Main extends MovieClip {
// キャラインスタンス
private var chara:Chara;
// 壁にあたった回数
private var cnt:uint;
public function Main() {
// キャラのインスタンスを生成
chara = new Chara();
// クリックイベントを設定
chara.addEventListener(MouseEvent.CLICK, onCharaClick);
// 壁に当たるカスタムイベントを設定
chara.addEventListener(CharaEvent.HIT_WALL, onCharaHitWall);
// 中央に配置
chara.x = stage.stageWidth / 2;
chara.y = stage.stageHeight / 2;
addChild(chara);
// 壁にあたった回数
cnt = 0;
// テキスト表示
outputText.text = cnt.toString() + "回 壁にあたった";
}
/**
* キャラのクリックイベント
* @param {MouseEvent.CLICK} e : マウスイベントオブジェクト
* @return {void} :
*/
private function onCharaClick(e:MouseEvent):void {
// キャラの毎フレームイベントを設定
chara.addEventListener(Event.ENTER_FRAME, onCharaEnterFrame);
}
/**
* キャラの毎フレーム関数
* @param {Event} e : イベントオブジェクト
* @return {void} :
*/
private function onCharaEnterFrame(e:Event):void {
chara.moveChara();
}
/**
* キャラが壁にあたったイベントハンドラ
* @param {CharaEvent} e : キャライベントオブジェクト
* @return {void} :
*/
private function onCharaHitWall(e:CharaEvent):void {
// 壁にあたった回数をインクリメント
cnt++;
trace("壁にあたった" + cnt.toString() + "回");
// テキスト表示
outputText.text = cnt.toString() + "回 壁にあたった";
}
}
}

Chara.as】

キャラの動きとイベントの設定


package {
import flash.display.MovieClip;
public class Chara extends MovieClip {
// キャラのスピード
private var speedX:int;
private var speedY:int;
public function Chara() {
// ランダムなスピードの値設定
speedX = Math.random() * 10;
speedY = Math.random() * 10;
}
/**
* キャラを動かす関数
* @param {} :
* @return {void} :
*/
public function moveChara():void {
// 動かす
x += speedX;
y += speedY;
// 壁にあたったかどうかのフラグ
var isHitWall:Boolean = false;
// 壁にあたった時のはねかえり処理
if(x < width / 2) {
x = width / 2;
speedX *= -1;
isHitWall = true;
} else if(x > stage.stageWidth - width / 2) {
x = stage.stageWidth - width / 2;
speedX *= -1;
isHitWall = true;
}
if(y < height / 2) {
y = height / 2;
speedY *= -1;
isHitWall = true;
} else if(y > stage.stageHeight - height / 2) {
y = stage.stageHeight - height / 2;
speedY *= -1;
isHitWall = true;
}
// ヒットイベントをブロードキャスト( = 登録されたリスナーのメソッドを実行する)する
if(isHitWall == true) {
var evt:CharaEvent = new CharaEvent(CharaEvent.HIT_WALL);
dispatchEvent(evt);
}
}
}
}

【CharaEvent.as】

このクラスでイベントを定義している


package {
import flash.events.Event;
public class CharaEvent extends Event {
// イベントの種類を定義(静的なプロパティ)
public static const HIT_WALL:String = "hitWall";
public function CharaEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) {
// 継承元のEventクラスのコンストラクタを呼び出す
super(type, bubbles, cancelable);
}
// EventDispacherを呼び出すためのオーバーライド
override public function clone():Event {
return new CharaEvent(type, bubbles, cancelable);
}
// toString()出力用
override public function toString():String {
return formatToString("CharaEvent", "type", "bubbles", "cancelable");
}
}
}