« ううむ | Home | XML最大の災厄 »

Jan 182009

baseが上手く適応されない件(Progression3.1.2)

先日Progressionがバージョンアップした(blog.progression.jp» ブログアーカイブ » [リリース] Progression 3.1.2 をリリースしました)それに伴い、SWFObjectが2にバージョンアップ。それに伴いJS関係が色々変更。
今進めている案件はJSONを組み込んだりとJSを結構弄ってしまっていたので、Class関係だけを更新してJSは前のままにしたら、SWFAddressが動作しなくなってしまった(汗

ということでJS系の更新を試みたのだけど、外部ファイル参照起点設定のbase="."が上手く認識されないのか、起点がindex.htmlになってしまっているっぽく、外部ファイルの参照ができなくなってしまった。

ということでバージョンアップの手順を実際にやりながら書いていく。
(検証しながら色々やっていると自分でどこまで潰したか分からなくなるので・・・)

まず、オデの良く使うフォルダ構造は

/root
 index.html
 /swf
  preloader.swf
  index.swf
 /data
  hoge.xml

っつーような構造で、参照起点をindex.htmlではなく、/swfにする。これはまぁhtmlから読み込んだ際にも、Flashのパブリックプレビューからでも同じように外部ファイルにアクセスして動作するようにしたいということです。(じゃないと正直開発できない。)(index.htmlと同じ階層にSWFを配置すれば問題は無いのだけど、ルートに色々ファイルがあるのは個人的に好みではないというだけ・・)

じゃあまずFlash単体で動作するようにしてみようちうことで、IndexSceneの中でTopちうCastSprite拡張のクラスをAddChildして、その中で外部XML(hoge.xml)を読み込んでみる。

ま、特に悩むことはない。簡単に書く

var url:URLRequest = new URLRequest("../xml/hoge.xml");
net = new LoadURL(url);
net.after(_onLoadComp);
net.error(function(e) {
	txf.text += e;
});
addCommand(
	net
	);

index.flaをパブリッシュプレビューすれば問題なく読み込める。

次にswf/preloader.swfswf/index.swfを読み込み、その中からxml/hoge.xmlを読み込んでみる。いや、別に特別なことは何も無い、Preloader.asのコンストラクタは

public function Preloader() {
	// 読み込みたい SWF ファイルの URL を設定します。
	url = "index.swf";
	
	// SWF ファイルの URL の起点を、自身の SWF ファイルが存在するフォルダにするかどうかを指定します。
	useSWFBasePath = false;
}

ですが、swf基点からの読み込みなので、特に変更せずとも読み込める。
(ただuseSWFBasePath ってのがイマイチどのswfまで継承されるのか良くわからないけど・・)

ということで、一度HTMLを経由して表示してみる。

まずindex.htmlの設定。今回かなりProgression.jsが変更になり、swfObjectのembedSWFをそのまま継承しているような形になっている。paramsbase:"."を設定。あと読込先SWFの指定は引数urlswf/preloader.swfを設定。(あとFlash表示のCSS ID名はreplaceElementId という変数で指定可能。他にもいくつかあるけど、今回は関係無いので割愛)

	

さてindex.htmlを見てみるとswf/preloader.swfは表示されるが、swf/index.swfが表示されてない。フム・・・。すでにこの時点でbaseが上手く設定できてない気配がする。ちなみにこの状態でPreloader.as


useSWFBasePath = true;

とすると、一応swf/index.swfは読み込み可能になる。ただしxml/hoge.xmlは読み込めない(#2032が発生)。多分これは根本的な解決になっていないと思うのだけど、falseになって起点がindex.htmlに戻ってしまうのもあれなので、そのままtrueにしておくことにする。

さて、何故にbaseが引き継げないのか?swfObject ver2.0の引数が変わっているのか?を確認するために一度progression.jsを経由しないでswfを貼り付けて検証。

index.htmlprogression.embedSWF部分を削除して、SWFObjectだけを使って貼り付けたindex2.htmlを作る。こんな感じ。


で、読み込んでみると上手く読み込める。(ちなみにここでPreloader.asuseSWFBasePath = false;にしてもswf/index.swfxml/hoge.xml共に問題なく読める。つまりembedのパラメータbaseさえしっかりしてればOKっつーこと。

ではprogression.jsからSWFObjectbaseが上手く渡っているのか?を検証。

SWFObjectの引数parObjをアラートで書き出してみる。上手く引数が渡っていればbase=.とアラートが出る。
SWFObjectで直接貼り付けたindex2.htmlを実行
>アラート表示、問題なし。
progression.js経由で貼り付けたindex.htmlを実行。
>bgcolor,wmode,allowfullscreen,allowscriptaccess,がアラート表示されるがbaseが出てこない。

どうも"base"が上手く引き渡されていないようだ。
ということでprogression.jsの中を見てみることにする。

今回のprogression.jsはcompressされていて、編集がしんどいので、/development/trunk/project/Flash/Extensions/Progression/Project/files/deploy/contents/scripts/progression-unpack.js – Progression – Tracを用いる。

で、これをprogression.jsに置き換えたら、いきなり"base"が継承されるようになって、xml/hoge.xmlの読み込みができるようになった。

ということで結論は
compressされたprogression.jsは、なんか不具合があるのかもしれない。
とりあえずcompressされていないprogression.jsだと正常に動作する。

です(汗

やっとこれで更新作業一歩前進。

Leave a comment

Search and Archives