アニメーション機能が付きました。「フレームクラス」
これ、上手いことしたらアニメーションとかもできるかもしれません。
と書きましたが、そろそろアニメーションも使いそうなので考えてみました。
前フレームクラスを改良しています。
/** * ・フレームクラス */ package lib.utils { import flash.display.DisplayObjectContainer; import flash.display.DisplayObject; import flash.display.Shape; public class Frame { // -------------------------------------------------------------------------------------- // --プロパティ ----------------------------------------------------------------------------- private var _objDOC :DisplayObjectContainer; // オブジェクト格納用オブジェクト private var _labelList :Array; // ラベルリスト private var _objList :Object; // オブジェクトリスト private var _currentObj :DisplayObject; // 現在のディスプレイオブジェクト private var _currentFrame :uint; // 現在のフレーム番号 private var _currentLabel :String; // 現在のラベル private var _playFlg :Boolean; // 再生中ならtrue private var _labelNum :uint; // 一意のラベル名設定用番号 // -------------------------------------------------------------------------------------- // --初期処理 ----------------------------------------------------------------------------- /** * ■コンストラクタ * * @param objDOC オブジェクト格納用オブジェクト */ public function Frame(objDOC:DisplayObjectContainer) { _labelList = new Array(); // フレームラベルリスト _objList = new Object(); // オブジェクトスプライトリストを生成 _objDOC = objDOC; // オブジェクト格納用オブジェクト _currentFrame = 0; // 現在のフレーム番号はとりあえず0 _currentLabel = ""; // 現在のラベルはとりあえず空 _playFlg = false; // アニメーション停止としておく // とりあえずシェイプを登録しておく _currentObj = new Shape(); objDOC.addChild(_currentObj); _labelNum = 0; // ラベル名設定用番号 } // -------------------------------------------------------------------------------------- // --通常メソッド ------------------------------------------------------------------------- /** * ■ディスプレイオブジェクト登録メソッド * * @param obj 登録するディスプレイオブジェクト * @param label 登録するディスプレイオブジェクトを指すフレームラベル */ public function setFrame(obj:DisplayObject, label:String = ""):DisplayObject { // ラベルが指定されていないなら if (label == "") { label = "noName0000" + _labelNum; // 一意のラベルを生成 ++_labelNum; // ラベル生成用番号をアップ } _labelList.push(label); // ラベルを登録 _objList[label] = obj; // オブジェクトを登録 return obj; // 登録したオブジェクトを返す } /** * ■ディスプレイオブジェクトフレーム番号指定登録メソッド * * @param obj 登録するディスプレイオブジェクト * @param num 登録するディスプレイオブジェクトのフレーム番号 * @param label 登録するディスプレイオブジェクトを指すフレームラベル */ public function setFrameAt(obj:DisplayObject, num:uint, label:String = ""):DisplayObject { // ラベルが指定されていないなら if (label == "") { label = "noName0000" + _labelNum; // 一意のラベルを生成 ++_labelNum; // ラベル生成用番号をアップ } _labelList.splice(num - 1, 0, label); // ラベルを登録 _objList[label] = obj; // オブジェクトを登録 return obj; // 登録したオブジェクトを返す } /** * ■フレーム移動共通メソッド * * @param frame 移動するフレーム */ private function gotoAndAction(frame:*):void { var label:String = ""; // ラベル // 指定されたフレームの型がuintなら if (frame is uint) { label = _labelList[frame - 1]; // ラベルリストからラベルを取得 _currentFrame = frame; // 現在のフレームを設定 } // 指定されたフレームが文字列なら else if (frame is String) { label = frame; // ラベルとして使う _currentFrame = getFrameNum(frame); // 現在のフレームを設定 } // それ以外の型なら else { return; // 終了 } // 対象フレームのディスプレイオブジェクト var obj:DisplayObject = _objList[label]; // 現在のフレームが指定したラベルのフレームと同じでないなら if (_currentLabel != label) { // 対象フレームのディスプレイオブジェクトが存在するなら if (obj != null) { // 表示切替 _objDOC.addChild(obj); _objDOC.removeChild(_currentObj); _currentObj = obj; _currentLabel = label; } } } /** * ■フレーム番号取得メソッド * * @param label 対象のラベル */ private function getFrameNum(label:String):uint { var list:Array = _labelList; // ラベルリスト var l:uint = list.length; // ラベルリストの長さ // ラベルリストの探索 for (var i:uint = 0; i < l; ++i) { // 指定したラベルが登録されているラベルと同じなら if (label == list[i]) { return i + 1; // 番号を返す } } return null; // 登録されていないラベルを指定したならnullを返す } // ■再生開始メソッド public function play():void { _playFlg = true; // 再生 } // ■再生停止メソッド public function stop():void { _playFlg = false; // 停止 } /** * ■フレーム移動&停止メソッド * * @param frame 移動するフレーム */ public function gotoAndStop(frame:*):void { gotoAndAction(frame); // フレーム移動 stop(); // 再生停止 } /** * ■フレーム移動&再生メソッド * * @param frame 移動するフレーム */ public function gotoAndPlay(frame:*):void { gotoAndAction(frame); // フレーム移動 play(); // 再生開始 } // ■アニメーションメソッド public function animate():void { // 再生中なら if (_playFlg) { var f:uint = _currentFrame; // 現在のフレーム gotoAndAction(f); // フレーム移動 ++f; // 次のフレームへ // 最後のフレームなら if (f > _labelList.length) { f = 1; // 最初のフレームへ戻る } _currentFrame = f; // 現在のフレームを設定 } } // -------------------------------------------------------------------------------------- // --プロパティ関連メソッド --------------------------------------------------------------------- // ■フレーム数 public function get length():uint { return _labelList.length; } // ■現在のディスプレイオブジェクト public function get currentObject():DisplayObject { return _currentObj; } // ■現在のフレーム番号 public function get currentFrame():uint { return _currentFrame; } // ■現在のディスプレイオブジェクトのラベル public function get currentLabel():String { return _currentLabel; } } }
ちょっとこれまで使ってきた「MovieClip」クラスっぽくしてみましたが中途半端です。
使い方の例です。
初期化部分です。
var stageSp:Sprite = new Sprite(); // ステージとするスプライト var objSp:Sprite = new Sprite(); // フレームを持たせるスプライト stageSp.addChild(objSp); var frame:Frame = new Frame(objSp); // フレームを持たせるスプライトを登録しオブジェクトを作成 // フレームに登録するディスプレイオブジェクトを作成 var sh:Shape = new Shape(); var shAt:Shape = new Shape(); var sp:Sprite = new Sprite(); var spAt:Sprite = new Sprite(); // フレームに登録 frame.setFrame(sh, "shape"); // ラベルを指定して登録 frame.setFrame(sp); // ラベルを指定せずに登録 frame.setFrameAt(shAt, 2, "shapeAt"); // 登録するフレームの番号を指定して登録 frame.setFrameAt(spAt, 3); // これもラベルを指定せずに登録できる // この段階でのフレームの登録状況は「sh, shAt, spAt, sp」となっている。 // 実際に表示するためにとりあえずフレームを移動しておく。 frame.gotoAndStop(1);
フレームの移動は「MovieClip」クラスっぽく「gotoAndStop()」と「gotoAndPlay()」があります。
どちらラベルもしくはフレーム番号でフレームを移動できます。
フレーム番号の最低値は「MovieClip」クラスっぽく1です。
ここからが新しい部分です。
「gotoAndPlay()」もしくは「play()」を実行した後、
「animate()」をループ実行することでアニメーションします。
つまりこれまでの「onEnterFrame」内で「animate()」を実行すれば
1回実行するごとに1フレームずつ表示が切り替わります。
(上の例の場合、sh -> shAt -> spAt -> sp -> sh ->・・・と表示され続けます。)
再生を止める方法は、お分かりのとおり「gotoAndStop()」もしくは「stop()」を実行します。
これでFlexでゲームを作る基本的な準備が整った・・・はずです。
あとはネタ待ちです。
何か不具合などありましたらご報告いただけますと助かります。