« やばし! | Home | SP »

Jan 262008

SWFをすべて読み込まないと再生されない

FLAファイルの挙動がおかしい。
書き出しの状態がストリーム再生しなくなってしまっている。
Loadingすら全ファイル読み込まないと表示されない。
なんだ?
コワイコワイ。


追記:2008/01/26 20:36

原因解明したので書いておきます。もしかして既出なのかもしれないけど・・。

問題:

自分自身と外部ファイルなどを統合したLoadingを実装しているSWFのLoadingが表示されない。通信内容を見ているとSWFすべてのデータをLoad完了しないと再生がされない。

仕様:

・swfobjectを使用。
・ハッシュコントロールの仕組みを入れている。(swfAddressではなくオリジナルのもの)
・初期変数をURLハッシュから継承。それをJSON変換しswfobject経由でFlashVarsに格納してSWFに引渡し。
・クラスの書き出しは1フレーム目。
・フォント、画像、サウンドなどのライブラリはコンパイルクリップにいくつか変換。ただし1フレーム書き出しは行わず、特定のMC(preLoad)のなかで初期化。

原因:
初期変数の引渡しにURLハッシュを使用しているのが原因。ハッシュがついているとその第一階層のSWFはストリーム再生が出来なくなるようです。ハッシュをつけない状態では正常にLoading。
例えばindex.swfをswfobjectで読み込んだ場合、URLにハッシュがついているとindex.swfはすべて読み込まれないと再生されない。(つまりストリーム再生が出来ず、Loadingが表示されない)

これを自分自身を上書きロードするやり方
_root.loadMovie("hoge.swf");
で置き換えてもNG。

結局一階層下に入れて外部MCとしてのLoadingさせる。
(本当はあまり階層化させたくなかったのだけど・・・)

Flashコンパイラが壊れたのか、JSONライブラリのバグなのか、コンパイルクリップの問題なのか、ハッシュコントロールの問題なのか・・・。。問題として考えられる範囲があまりに大きく検証に時間がかかった。

外部ファイルの先読みが必要な場合、および自分自身のデータサイズが大きい場合にはちょっと面倒。
こういうときはAS3のaddChildの考え方はとても便利だと思った。


追記:2008/01/27 21:36

これロードされない原因が分かりました。
もう全然使わないから忘れていましたけど、元々Flashの持っているanchor機能が悪さをしていた模様。
例えばindex.html#ahoaho
とした場合、読み込まれたSWFはまず最初にタイムライン上の"ahoaho"というアンカー名のついたフレームを走査するようです。で、それまではとりあえずタイムラインは流れない。全SWFデータをLoadしてもアンカー名の定義されたフレームが見つけられない場合、通常のタイムライン進行が開始される。
という感じの挙動のようです。

なのでそのアンカー名を1フレーム名に定義してやれば、SWFは1フレーム目をLoadした瞬間にそのアンカーが定義されたフレームにタイムラインを移動させ、タイムライン進行を開放させます。

ただし何かしらの変数をハッシュで引き渡す場合は動的にフレームにアンカー名は付けれないので(確かAS3でもラベル名まで)、ハッシュから変数を取得後、任意のハッシュ名で上書きしてやる。
URLハッシュの上書きはJSで行い、そのハッシュ名をFlashの1フレーム目にアンカーとして定義しておく。

という感じでクリアできるかと思います。

まぁこういう作り方をするよりも、外部SWFをハッシュ引数付でLoadしてやったほうがLoadingも制作も簡単ですが、深度が深くなることで下層MCにおけるフレームレート低下を避けたい場合などは上記の手法が効果的かと思われます。

なんつーかあまりに使わない機能なのでまったく頭から抜け落ちていました。
(そもそもタイムラインなど使わないし・・)

1 Comment

この問題swfaddressの仕様をきちんと読んでないので分からないけど、もしかしたら書いてあるかもしれない。

Leave a comment

Search and Archives