記事内のFlashが一部見れなくなってました

2010年7月 4日
お久しぶりです。
久々すぎて、MovableTypeの使い方分からなくなってる。。
少し前からwonderflでコード書いてたんだけどね。
それを記事にしようとすると結構面倒くさくて、、まとめるのムズカシイ

そうそうタイトルの件です。いつのまにか昔の記事のFlashが見れなくなってたっていう。見れないっていうかくるくる回るローディングが途中で止まってました。以前は見れたのに。

それでしばらく調べてわかったこと。
結論から言うと、どうもFirefoxの一部のバージョン(1.5、2.0、3.6.4、3.6.6)でhtmlに埋め込んだFlashを再生するとLoader.load()で空文字や半角スペースのパスをロードした時にエラーイベントも完了イベントも発生しないというのが原因だったらしい。

そんなルールあったんだ・・・

問題があったFlashではローディング画面でPapervision3D用のテクスチャ画像とDAEモデルを読み込んでいるんだけど、DAEモデルを読み込む部分で先に進まなくなってたんです。それでDAEクラス内の動きを調べたら、テクスチャ画像を読み込む部分のLoaderクラスの処理で毎回止まってました。どうやらLoader.load(new URLRequest(画像パス))って処理のところで、画像パスが空文字だった時にLoaderがエラーイベントを返さなくなっていたらしい。そのせいでDAEクラスもイベントを返せなくなっていた・・・多分そんな感じ。

確認用Flash

loadertest.swfソース
一応置いときます。空文字のパスをロードした時のエラーイベント発生状況を調べた時に作ったやつです。ボタンを押すとラベル名をURLとしてLoader.load()します。一番左が問題の空文字。全部存在しないファイルとかなんで、クリックして赤いエラーメッセージが出ればOKです。

Windows7+FlashPlayer10.1の環境で、IE、Safari、Chrome、Operaに関しては最新版しかチェックしてないけど、これらのブラウザでLoader.load(new URLRequest(""))をやるとちゃんとエラーイベントが返ってきました。でもFirefoxは最近でた3.6.4と3.6.6、あと昔の1.5と2.0のバージョンで再生すると何故かエラーイベントが発生しなかった・・・
SWFを埋め込まずに再生するとまた結果が違ってくるらしく、こっちはFirefox3.6.6でもエラーが発生してくれました。

空文字の原因

そもそもなんで空文字のパスでLoader.load(new URLRequest(""))とかしてるの?って話なんだけど、元々ステージモデルとかのdaeファイル内にはテクスチャの設定がしてあって、テクスチャの画像パスなんかも含まれてました。DAEクラスは自動でテクスチャ画像を読み込んでくれる機能もあるんだけど、何故かこれがうまくいかなかくて、、それで諦めて、事前に別処理で読み込んでおいた画像をマテリアルリストとしてDAE.load()時に渡す方法にしてたんです。マテリアルリストを渡す場合はDAEクラスによる外部テクスチャ画像の読み込みは不要になるので、じゃ画像パスはいらないよね!ってdaeファイル内のテクスチャ画像パスを全部削ったのがいけなかった。

↓問題のあったdaeファイル内のテクスチャ画像パスが記述されていた部分
<library_images>
	<image id="face">
		<init_from>ここにあった画像パスを消していた</init_from>
	</image>
	<image id="foot">
		<init_from>ここにあった画像パスを消していた</init_from>
	</image>
	<image id="hand">
		<init_from>ここにあった画像パスを消していた</init_from>
	</image>
</library_images>
DAEクラスはマテリアルリストを渡されても一応daeファイル内の上記の画像パスは読み込もうとはするらしい。パスを消していたもんだから空文字になってしまって、それで今回の問題が発生してしまった・・・んだと思う。

本当はマテリアルリストを渡す場合はここのテクスチャの読み込み処理が発生しないようにするべきなんだろうけど、ひとまず#を入れてエラーが出るようにしておきました。空文字とか半角スペースだけとかを避ければエラーになってくれるはず。

↓応急処置後
<library_images>
	<image id="face">
		<init_from>#</init_from>
	</image>
	<image id="foot">
		<init_from>#</init_from>
	</image>
	<image id="hand">
		<init_from>#</init_from>
	</image>
</library_images>
こんな感じでとりあえずFirefox3.6.6でも見れるようになった・・・めでたしめでたし。ちなみにこれは間違ってdaeファイル内の画像パスを消しちゃった場合の対処法ね。そんな人他にもいるのか疑問だけど。。

結局

Loaderクラスで外部画像を読み込む時、事前にURLが決まっている場合は今回みたいな事にはならないけど、URLを動的に生成するケースでは何かの原因で空文字が指定される事もあるかもしれない。そうなると読み込みが完了するか、エラーが出るまで待機するような設計だった場合ブラウザによっては先に進めなくなってしまうから、どんなパスが指定されるか予測できない時は読み込む前にURLをチェックして処理を分岐させる必要があるって事なのかな。とりあえず空文字と半角スペース1個にはならないようにしとこう。

DAEクラスでテクスチャがうまく読み込めない原因

マテリアルリストを渡すはめになった「daeファイルで指定したテクスチャが読み込めない現象」は、ここの記事に解決策が書いてありました。これでなんとかなりそうな気がします。

トラックバック(0)

トラックバックURL: http://www.morocoshi.net/mt/mt-tb.cgi/29

コメントする