書き物

技術とか作った物の話とか愚痴文句感想など

フレームクラス

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()」を繰り返すようなアニメーションって、

結構重くなりそうで怖いです。

試していないので分りませんが。