AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


C/C++ではアロケートはmalloc(calloc,realloc)/free、GlobalAlloc/GlobalFree、new/deleteなどで自分で操作する必要がありました。


PHP/Perl/Java/C#などでは問答無用でスコープから抜けた瞬間にガーベッジコレクションされます。


ではActionScript3.0ではというと次のような仕様となっていることが分かりました。


以下はaquy blogさんの記事『AS3.0 GC(ガベージコレクタ)についてのメモ 』からの引用です。

・再生しているサウンドは止める 
・メインタイムラインが再生中なら Stop する 
・再生中のムービークリップも全部 Stop する 
・ネットワークオブジェクト、つまり Loader, URLLoader, Socket, XMLSocket,
  LocalConnection, NetConnections, NetStream 等のインスタンスは  接続解除しておく 
・カメラやマイクの参照を切る 
・swf 内の全てのイベントリスナーを解除 
・表示オブジェクトは全て removeChild() する 
・setInterval してたら clearInterval() する (これはAS2.0からあった) 
・Timer オブジェクトを止める。Timer クラスのインスタンスメソッド
  である stop() を使おう 
・使った全てのオブジェクトに null をぶち込む (参照切断。最後に行う事)


C/C++なら子から順に解放するのは当たり前の仕様なんですが、ガーベッジコレクタ実装をうたうのなら親を解放した時には、参照されているアロケート領域全てを順に解放して欲しいものですね…。


イベントリスナの解放が怪しいので、またソースを見直さないといけませんね(泣)

AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


Loaderを使用したSWFデータの取得において、widthやheightなどの定義場所が分かりにくいのでメモ。


今回はAVM1Movieではなく、Flash CS4でFlash Player9用でActionScript3.0用でPublishしたAVM2MovieなのでMovieClipにキャストしています。


以下コードです。



// SWFの読込み
var context:LoaderContext = new LoaderContext();
context.allowLoadBytesCodeExecution = true;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, SwfLoaderCompleteHandler);
loader.loadBytes({SWFのバイナリデータ}, context);

function SwfLoaderCompleteHandler(evt:Event) : void
{
    // ロードしたバイナリをMovieClipに変換
    var loader:Loader = evt.target.loader;
    var mc:MovieClip = loader.content as MovieClip;

    // width確認(これでは駄目。結果は0)
    trace(mc.width);

    // width確認(こっちではOK。結果は正しく出力された)
    trace(mc.loaderInfo.width);
}


上記のように、キャストしたインスタンスのプロパティを参照しても値は0のままです。Bitmapをキャストした時にはwidthが挿入されているのに何故?といった感じです。


とりあえずはMovieClipのloaderInfoの中に値は格納されているみたいです。MovieClipもBitmapもDisplayObjectからの継承なので違いはないと思うのですが、なぜMovieClipの場合はloaderInfoの中でしか定義してくれないのでしょうか?


じゃあ自分でwidthに挿入しようと思い、


mc.width = mc.loaderInfo.width;


などとするとMovieClipが表示されなくなりました。どうやらMovieClipは直接widthの値を直接入力して大きさを変更することはできないようです。


mc.scaleXは値が格納されていて、新たに数値を挿入すると反映されますので、大きさを変えたい時はこちらを使用しろということなのでしょう。


AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


AVM1Movieクラスが本当に単純なSWFの実行しかできないのが分かり、ノベルゲームエンジンに実装するには厳しいことが分かりました。


そんなわけでActionScript3.0環境でもMovieClipクラスへキャストできるように、オーサリングツールを「Flash CS4」に変更することにしました(といっても体験版ですが)。


早速、Flash8で作成したロゴSWFを移植することにしたのですが、Flash8で作成したSWFは当然ActionScript2.0なので3.0に書き換えないといけません。


ところが文法を3.0に書き直しても発生するエラーがあります。


メインタイムラインのフレームアクションで定義している自作クラスのインスタンスが、MovieClipシンボル内のタイムラインから参照できないのです。


色々調べてみると、どうもコンパイラがStrictモードになっているのが原因らしいです。


こちらのサイトでその原因が詳細に書かれていました。


rootプロパティでメインタイムラインの関数にアクセスできない

by FumioNonaka.comさん


要するにエラー発生時期をSyntaxエラーを発生させるかRuntimeエラーで発生させるかの違いということです。


Strictモードでは実行時に解決できるかもしれないという書き方では、エラーになるということですね。


というわけで無事解決したので、メモっておきます。