フレームクラス

Flex2ではどうやらムービークリップを扱えないようです。
つまりフレーム一つ一つに動作を描き「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()」を繰り返すようなアニメーションって、
結構重くなりそうで怖いです。
試していないので分りませんが。