- 2009年3月18日 01:01
- ActionScript 3.0 | Flash
プログラムは間違っていないのに動かない!
修正したはずなのに修正が反映されない!
俺のPCでだけうまくパブリッシュされない!
Flashやってるとこういう事がけっこう起こります。
気がつくと1時間くらい格闘するとかあって非常に困ります。
今日はそんな時に疑うべき要素とその解決(するかもしれない)方法を
あたりまえじゃんという所から
ちょっと深く突っ込んだ内容まで含め8つほど紹介します。
ちなみに若干長いです。
(基本的に FlashCS3 でAS3.0 での話です)
(早くも若干追記しました)
修正したはずなのに修正が反映されない!
俺のPCでだけうまくパブリッシュされない!
Flashやってるとこういう事がけっこう起こります。
気がつくと1時間くらい格闘するとかあって非常に困ります。
今日はそんな時に疑うべき要素とその解決(するかもしれない)方法を
あたりまえじゃんという所から
ちょっと深く突っ込んだ内容まで含め8つほど紹介します。
ちなみに若干長いです。
(基本的に FlashCS3 でAS3.0 での話です)
(早くも若干追記しました)
文字コード
XML等を使っている時確認すべき内容
基本中の基本ですね
Flashは基本UTF-8が推奨なわけですが
Shift-JISだったりとかUTF-8Nだったりとか・・・
しっかりと確認しましょう。
もしどうしてもUTF-8以外を使わなければならない場合には
System.useCodePage = true;を使えば利用可能ですが、UTF-8以外は非推奨とされており
文字を扱う系の挙動が安定しませんので要注意です。
ベースパス
FlashをHTMLに組み込む時はベースパスに注意が必要です
例えば相対パスで読み込む画像を
./images/photo.jpgと指定していた場合
読みに行くのはあくまでも HTML からの相対パスなので
もしもディレクトリ構造が以下のような場合には
画像を読み込むことが出来ません。
~/index.html ~/swf/main.swf ~/swf/images/photo.jpgなぜかというと、 ./images/photo.jpg はHTMLからの参照になるので
~/images/photo.jpgを読みに言ってしまうためです。
このような場合には、ベースパスを指定してあげることで解決できます。
objectタグの場合
<param base="./swf"/>embedタグの場合
<embed .... base="./swf" .... />
と指定すれば動くはずです。(はずって)
意外とこれではまる人が多いです。
クラスパス
実は僕自身これではまった経験ありです・・・
Flashのクラスパス設定は、IDE自体の指定と
flaファイル個別の指定の二種類があります。
前者はFlashの 編集 > 環境設定 > ActionScript の項で
後者はFlashの ファイル > パブリッシュ設定 > Flashタブ
でそれぞれ設定が可能です。
ちなみに、ファイル側に何も指定していない場合
IDEで指定したパスが優先的に扱われるようです。
ブラウザ依存
Flashにブラウザ依存は無いと信じている人
まず、その信仰を捨てることをオススメします。
Flashにも若干のブラウザ依存が存在します。
ここで全てを語ることは出来ませんが、2つほど例を挙げます。
◆ ExternalInterface
FlashとJavascriptを連携させる時には
ExternalInterface というものを使いますが
IEに限り、ExternalInterface を扱う時
object タグのidに external という文字列がないと動きません。
例えば以下のような感じです
<object id="externalSWF"></object>
含まれていれば動くので、externalSWF でも SWFexternal でも
SWexternalF でも動きます。これは注意です。
◆ stage
稀に1フレーム目で stage.stageWidth を参照すると
きちんとした値が取れないという現象に遭遇することがあります。
この現象は、自分自身が読み込み終えているかを監視し
読み込み終えてから処理を開始することで回避出来ます。
ドキュメントクラスのコンストラクタに書くとしたらこんな感じです
// コンストラクタ.
public constructer():void{
if( loaderInfo.bytesLoaded == loaderInfo.bytesTotal ){
_onComplete();
}else{
loaderInfo.addEventListener(Event.COMPLETE, _onComplete);
}
}
// 読み込み完了時の処理.
private function _onComplete( e:Event = null ){
// ...
}
ファイルの読み込み順序
例えば、A.swf, B.swf という二つの swf を A > B の順で読み込む
という処理を行うようなFlashを作っている時に疑うべき要素です。
このようなFlashで、A, B 両者とも同じクラス
(今回の例では OriginalClass というクラスで説明します。)
を内部の実装で使っていたら完全に怪しいです。
このようなFlashを開発中に、故あって B.swf の改修が必要となり
その改修は OriginalClass の修正も必要だということになって
OriginalClass を修正し B.swf をパブリッシュし直したはいいものの
実際に読み込むFlashを開いて直ってるか確認したら
なおってNEEEEEEEEEEE!!!!となったら、多分これが原因でしょう。
実はこの現象は、同じクラスが複数のファイルで使われている場合
先に読み込まれたファイルのクラス実装が優先される。
という挙動に起因しています。
今回の例の場合、OriginalClass の実装が先に読みこんだ
未修正である A.swf の状態として扱われてしまったため
B.swf の修正が反映されなかった為に修正が反映されなかったわけです。
大きめの開発になってくると、このように各コンテンツを切り分け
複数のswfをつくり、後で順番に読み込んで使うという方法は
よく使われている開発手法のひとつだと思います。
こうすることで、コンテンツ毎に開発者を切り分けたり
コンテンツの修正が容易になるなど非常に便利なためです。
しかし、この挙動を知らないと、プログラムを修正しても
全然修正が反映されない!なぜだ!?という事になってしまいます。
これは結構はまると抜け出せないです。
でも毎回全部パブリッシュする癖がある人は経験したこと無いかも
もしくは、こういう経験があったから毎回全パブリッシュ!
という人も結構いるんじゃないでしょうか。
swfファイル
実は、Flashでパブリッシュを実行しても
includeされるクラス群が変わらない時が稀にあります。
(正直遭遇した時は、おいおいマジかよ・・・って思いました)
修正したのに、全然反映されない・・・
という経験がある方はこの可能性を疑ってみてください
この問題は、swfファイルを一度削除してから
再度パブリッシュすることで解決できます。
flaファイル
消したはずのライブラリシンボルからエラーが出る
全然関係ないところでエラーが発生する
そんな時は ファイル > 保存して最適化 を行うと直ることがあります。
試してみてください。
Flash自体
これは最後の手段です・・・
Flash自体を再インストールすると直ることがあります
とまあ、いろいろな解決策を挙げてみました。
皆さんのお役に立てれば幸いです。
とはいえ、解決策としては一例に過ぎません。
また、解決を保障するものではありません。あしからず。
- Newer: FlashCS4の不可解な挙動とその回避策の覚書
- Older: AS3 MouseEventの挙動とmouseChildren