カテゴリー別アーカイブ: AS3

LoaderContext/ApplicationDomainの使い方を自分なりにメモ


未だによく分かってないのでメモ。

swfが親子になっていて、それらのクラスを共有させたい場合、これを使わないと、エラーが出て何が何だか分からなくなる。あと、音ファイルだけ別にしてgetDefinitionByNameする時とか。

基本は親と子で同じクラスを使いたいと思うので、親が子を読む際に自分と同じApplicationDomainに読み込む。

var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
loader.load(path, context);

通常はApplicationDomain.currentDomainを使っていれば問題ないみたいなんですが、子供同士でバッティングしてしまうクラスがあると面倒なことになる様子。

この場合は

context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

として子供のcontextを逐次変更すれば、子供同士のクラスはバッティングしなくなりながらも、子供は親と共通のクラスを使える。はず。

何でもApplicationDomain.currentDomainにすればいいってもんでもないんですね。

loaderInfoからapplicationDomainを取る方法もあるみたいですが、勉強不足。

参考

そろそろTweensyを覚えたい。

テキスト入力の備忘録


随分久々になってしまいましたが、そろそろこちらを有効活用しようかなと思い始めています。

さて、Flashを使っているとブラウザやプレイヤーによってさまざまなバグと遭遇することがありますが、前に痛い目を見たのが「テキスト入力」。プレイヤーが一緒でもブラウザによって動作が違うなど、なかなか曲者です。

FileReferernceとテキスト入力

最も悩まされたのがこれ。IE7+Windowsで発生。FileReferenceでファイルをアップロードして文字情報を入力するようなものだったんですが、FileReference.browse()を実行した後、半角全角キーが効かなくなり、半角英数しか入力できなくなるという現象がありました。一度Flashからフォーカスを外せば治る(例えば検索バーにフォーカスを当てるとか)のですが、まあ、それを利用者に強要するわけにもいかない。さてどうしたものか。

結局、FileReferenceにイベントリスナをつけて、ファイルが選択された、あるいはファイルの選択がキャンセルされた時に、Flashへのフォーカスを当てなおせばいいようです。

これ、アップロードする部分と文字情報入力部分が離れてたもんで、危うく気づかないところでした。

private function windowActive():void{
if(Capabilities.os.substr(0, 3) != 'Win'){return;}
try{
ExternalInterface.call('function(){window.focus();document.getElementById("FlashのID").focus();}');
}
catch(err:Error){
trace(err.message);
}
}

try-catchしないとFlashIDEでデバッグした時にエラーになってしまうので一応。

Mac Leopard+Firefox3

上記の対策で、さてWindowsは動いたよかったよかったと思ってたんですが、今度は逆にMac LeopardのFirefox3で動かなくなってしまいました。仕方ないので、OS判定を入れることにしました。原因はそこにあったか不明ですが、とりあえずWin,Macともに動くようになりました。

Firefox2やSafari3では問題なかったのでMacというよりMac版Firefox3の問題だとは思いますが、何故起こったのか未だにわかりません。特に問題のあるコードでもなさそうなんですが。

Mac Tigerでの不具合

日本語の入力モードの変換にはIME.enabledのtruefalseやIME.conversionModeの切替で行いますが、IME.conversionModeが実は曲者だったようで、Mac Tiger環境下でJAPANESE_HIRAGANAに変更すると時々ブラウザごと落ちる場合がありました。実際には変更した瞬間ではなく、モードを変更し、違うフィールドに移った上で、2回以上変換キーを押すと落ちるという感じした。

  1. 日本語入力フィールドが2つあって、それぞれ、フォーカスが当たったらconversionModeを変更するようにした。
  2. 一方のフィールドにフォーカスが当たっているだけのときはいくら変換キーを押しても問題なし。
  3. しかしその後、他方のフィールドにフォーカスを当て、日本語を入力し、変換キーを押すと2回目でブラウザが落ちる

これはブラウザに関係なく、Mac Tiger環境では全てそうなりました。まあ、何かしらやり方が不味かったのかもしれませんが。とりあえず、IME.enabledの変更は効くようなので、そちらに逃げることでブラウザ強制終了は回避できるかと。自動で日本語入力にはできないことになりますが、落ちるよりはマシかなーとね。

もしかすると、TextFieldのrestrict設定の有無でも動作が変わるかもしれません。この辺りは要調査かな。