フレームクラス
つまりフレーム一つ一つに動作を描き「gotoAndStop()」などで切り替えて状態移行が出来ないということです。
この状態移行は僕がFlashでゲームを作るときかなりの割合で使っていた方法なので、
今後どうやってゲームを作るか、涙無しには語れなくなります。
ということでムービークリップみたいな擬似的にフレームを持ったクラスがあったら便利かもしれないと思い、考えてみました。
/** * ・フレームクラス */ package { import flash.display.DisplayObjectContainer; import flash.display.DisplayObject; import flash.display.Shape; public class Frame { // -------------------------------------------------------------------------------------- // --プロパティ ----------------------------------------------------------------------------- private var _objDOC :DisplayObjectContainer; // オブジェクト格納用オブジェクト private var _frameList :Object; // フレームリスト private var _currentObj :DisplayObject; // 現在のディスプレイオブジェクト private var _currentLabel :String; // 現在のラベル // -------------------------------------------------------------------------------------- // --初期処理 ----------------------------------------------------------------------------- /** * ■コンストラクタ * * @param objDOC オブジェクト格納用オブジェクト */ public function Frame(objDOC:DisplayObjectContainer) { _frameList = new Object(); // オブジェクトスプライトリストを生成 // とりあえずシェイプインスタンスを割り当てておく _currentObj = new Shape(); objDOC.addChild(_currentObj); _objDOC = objDOC; // オブジェクト格納用オブジェクト _currentLabel = ""; // 現在のラベルはとりあえず空 } // -------------------------------------------------------------------------------------- // --通常メソッド ------------------------------------------------------------------------- /** * ■ディスプレイオブジェクト登録メソッド * * @param label 登録するディスプレイオブジェクトを指すフレームラベル * @param obj 登録するディスプレイオブジェクト */ public function setFrame(label:String, obj:DisplayObject):DisplayObject { _frameList[label] = obj; // オブジェクトを登録 return obj; // 登録したオブジェクトを返す } /** * ■フレーム移動メソッド * * @param label 移動するラベル */ public function gotoFrame(label:String):void { // 対象フレームのディスプレイオブジェクト var obj:DisplayObject = _frameList[label]; // 現在のフレームが指定したラベルのフレームと同じでないなら if (_currentLabel != label) { // 対象フレームのディスプレイオブジェクトが存在するなら if (obj != null) { // 表示切替 _objDOC.addChild(obj); _objDOC.removeChild(_currentObj); _currentObj = obj; _currentLabel = label; } } } // -------------------------------------------------------------------------------------- // --プロパティ関連メソッド --------------------------------------------------------------------- // ■現在のディスプレイオブジェクトのラベル public function get currentLabel():String { return _currentLabel; } } }
こんな感じで使えます。
package { import flash.display.Sprite; import flash.display.Shape; import flash.display.TextField; public class TestClass extends Sprite { private var _frame:Frame; // フレーム // ■コンストラクタ public function TestClass() { var objSp:Sprite = new Sprite(); // フレームの基本となるオブジェクト格納用スプライトの生成 addChild(objSp); _frame = new Frame(objSp); // フレームの生成 _frame.setFrame("shape", new Shape()); // フレームにシェイプを登録 _frame.setFrame("text", new TextField()); // フレームにテキストフィールドを登録 _frame.gotoFrame("text"); // フレームを移動する時はラベルを指定する objSp.x += 10; // 基本となるスプライトを動かしてキャラの移動とかをする } } }
これ、上手いことしたらアニメーションとかもできるかもしれません。
しかしこんな「addChild()」や「removeChild()」を繰り返すようなアニメーションって、
結構重くなりそうで怖いです。
試していないので分りませんが。