2013年12月7日土曜日

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");
          }
     }
}

0 件のコメント:

コメントを投稿