仕事でFlash作るならフレームワーク必須やも
Flashは描画処理の部分がかなり複雑化することが多いので、
フレームワーク無しでパフォーマンスを出せる自信がありません。
progression4は、ライブラリもフルフラッシュ向けに充実していてすごく使い易いので、
単純に生産性が上がるのも嬉しいです。
http://progression.jp/ja/
http://www.gaiaflashframework.com/
フレームワーク導入でビルド時間が気になる年頃に
ビルドを気にするなんてJavaとかCのプログラマだけだろうと思ってました。
初めてProgressionを使ったときは、
Flash DevelopのFlash IDE Projectで作業していたんですが
CS4だとやはりそれなりに時間がかかります。
またパブリッシュ中に大抵「応答なし」になるのも地味にストレスだったりします。
Flex SDKのコンパイラ(fcsh)が高速だということなので、
今後はこちらを使うことにしました。
作業
Flash IDEでシンボル作成→ActionScriptに書き出し

SWFをパブリッシュ(例:assets.swf)
ソースファイルから参照しやすいパスに置く私はsrcフォルダに入れています。
Embedタグを記入
ドキュメントクラス等に、
[Embed(source='assets.swf', mimeType='application/octet-stream')]

埋め込んだswfのクラスを作成して初期化処理を書く
Progressionでこの方法を使うとすると、
Index.asのテンプレートで、初期化メソッドatReady()に書いてある、
// 開発者用に Progression の動作状況を出力します。
Debugger.addTarget( manager );
// 外部同期機能を有効化します。
manager.sync = true;
// 最初のシーンに移動します。
manager.goto( manager.syncedSceneId );
このあたりの処理が気になりました。
埋め込みSWFの初期化処理の後に行った方がよい気がするので、
[Embed(source='assets.swf', mimeType='application/octet-stream')]
private var Assets:Class;
private var _appDomain:ApplicationDomain;
override protected function atReady():void
{
initAssets();
}
//embedしたSWFの初期化
private function initAssets():void
{
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
function(event:Event):void { _appDomain = event.target.applicationDomain; });
loader.loadBytes(new Assets());
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onAssetsLoad)
}
//assets初期化完了時
private function onAssetsLoad(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE,onAssetsLoad);
// 開発者用に Progression の動作状況を出力します。
Debugger.addTarget( manager );
// 外部同期機能を有効化します。
manager.sync = true;
// 最初のシーンに移動します。
manager.goto( manager.syncedSceneId );
var asset:DisplayObject=createInstance("Asset")
//確認用にstageに表示してみる。
stage.addChild(asset);
}
public function createInstance(name:String):DisplayObject
{
return new (_appDomain.getDefinition(name) as Class);
}
こんな感じにしてみました。
こちらの記事と、seyselfさんのコメントが非常に役立ちました。ありがとうございます。
(一部改変利用。問題があれば書きなおします。)
まだFlashが行う各種初期化のタイミングがつかめていないので、もっといい方法があると思います。
(埋め込みSWFを管理するオブジェクトを定義してコンポジションするとか?冗長すぎる?)
または、リンケージしたシンボルに対して直接、
[Embed(source='assets.swf', symbol='Asset')]
public var Asset;
とすることで読み込めます。
ちなみにMovieClipをリンケージしても、
MovieClipのタイムラインに1フレームしかないとシンボルのクラスはSpriteになり、
フレームが複数あるとMovieClipになるようです。
(基本クラスがMovieClipでも同様。)
ついでにapplicationDomainについても調べてみた
SWFごとにクラス定義を分離して競合を防げる(使用形態A)
ランタイム共有ライブラリを作れる(使用形態B)
RIA等の大規模開発用のクラス整理などに使える(使用形態C)
などの利便性があるようです。
クラス定義のガベージコレクションとか想像がつきません。
実行時のクラスの挙動まで考えるとなると、本格的にOOPのノウハウが必要な気がします。
Runtime Shared LibruaryとRemote Shared LibruaryがどっちもRSLでわかりづらい。。
akihiro kamijoさんが解説しています。livedocsは
こちら。