« 同業者 | Home | 眠い! »

Jun 232007

リンケージされたbitmapが認識できなくなる

icon_flash8.jpg世の中がAS3で盛り上がっている中、天気の良い土曜日に未だAS2で四苦八苦して涙を流している今日この頃みなさま如何お過ごしでしょうか?

ちょっとこれはまだ既出なのかも、原因も良くわかってないのだけど、取り急ぎメモ。
明確な情報知ってる人がいましたら教えてくださいませ。

トラブルの内容は外部SWFの中でリンケージビットマップを操作している場合、loadして表示後、再度loadする場合、元の読み込みをunloadしていると次に読み込んだ先でリンケージビットマップが認識されない。というもの・・。
非常に説明しにくい状況ですが、詳細は以下。

複数の外部SWFから構成されるコンテンツが存在したとして、その子SWFが、リンケージされたビットマップを保持していたとする。で、その中に以下のようなクラスに関連付けられたMovieClipインスタンスがあるとする。

import flash.display.BitmapData;
class uniqlock.world.TestBM extends MovieClip{
var bgBM : BitmapData;
public function TestBM(){
}
public function onLoad(){
makeBG();
}
public function makeBG () {
makeTxture();
}

private function makeTxture(){
trace("Background.makeTxture / ")
bgBM.dispose();
var ref = this.createEmptyMovieClip("iBody",1);
var _bm = "BM1"
bgBM = BitmapData.loadBitmap (_bm);
trace("_bm="+_bm)
trace("bgBM = "+bgBM)
var w = 100
var h = 100;
trace([w,h])
ref.beginBitmapFill (bgBM, null, true, false);
ref.moveTo (0, 0);
ref.lineTo (0, h);
ref.lineTo (w, h);
ref.lineTo (w, 0);
ref.lineTo (0, 0);
ref.endFill ();
}
public function onUnload(){
bgBM.dispose();
}
}

つまりこのMovieClipは表示されると同時に100*100の"BM1"というテクスチャで覆われた四角を描画します。これは特に問題なし。

で、親SWFでこの子どもを制御する際に構造的にいくつかパターンが想定されます。
1)特定の名前のインスタンスに常に読み込む。
つまり常にoverwrite。

dep = 1;
function loadContents() {
ref = this.createEmptyMovieClip("mc", 1);
ref._x = 100*(dep+1);
mc.loadMovie("testReDifineTxture.swf");
dep++;
}
function unloadContents() {
mc.unloadMovie();
}

これは特に問題なし。

2)常に異なる名前、深度に読み込む場合
つまり複数同時に存在する可能性がある場合

dep = 1;
function loadContents() {
ref = this.createEmptyMovieClip("mc"+dep, dep);
ref._x = 100*(dep+1);
ref.loadMovie("testReDifineTxture.swf");
dep++;
}
function unloadContents() {
ref.unloadMovie();
}

この場合一度loadContentsを行った後でunloadContentsを行うと、それ以降リンケージされたビットマップが消失する。
ただし、連続してloadContentsを行う場合。また画面上に一つでもloadContentsで生成されたMovieClipが存在している場合はリンケージビットマップは認識される。

で、unloadContentsの中の"ref.unloadMovie();"を"ref.removeMovieClip();"に変えてみる。

function unloadContents() {
ref.removeMovieClip();
}

さて、これだと特に問題なく動作する。

ということでどうもunloadはリンケージビットマップに対して何かしら影響を与えているのだということが予想されるのだけど、それがなんなのかは良くわからない。

ちなみにリンケージオプションの「最初のフレームに書き出し」をやめて、タイムラインに配置したとしても消失する。なんとなくリンケージ名のコンフリクトが起こっているような感じがするがそれをどー確かめたらよいのかは分からない。

あ、あと今は外部読み込みはMovieClipLoaderを使うことがほとんどだと思うのだけど、
この場合も特に違いはなくunloadではリンケージビットマップが認識できなくなる。

で、結論から言うとunloadを使わず、removeを使ったほうが安心だということだ

Leave a comment

Search and Archives