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"); } } }
0 件のコメント:
コメントを投稿