« AS3での埋め込みフォントの共有について:其の四[ランタイム共有ライブラリ+フォントクラス編](ちょっと解決) | Home | 翻訳 »

Feb 072009

AS3での埋め込みフォントの共有について:其の伍[RSLの先読み対応 with Progression](多分解決)

さて、現実的に使うためにどーするか?ということを考えてみます。特にProgressionで・・・。

問題点としては
1)共有フォントの読み込みがドキュメントクラスのコンストラクタ前に発動してしまう。
2)ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう。
この2点をなんとか解決したいと思います。

2)はloaderInfoの"Event.COMPLETE"がRSLが存在すると発動しないというのが起因しているかと思います。(何故なのか?は不明。そもそもRSLのローディングが管理できないのでどーしていいのやら)
ということで、コチラは無理やり"CastDocument"のコンストラクタに

addEventListener(Event.ADDED_TO_STAGE, _onAdd);
として、_onInitに連結します。(override出来ないから)

これに関しては諸々調べていますが、問題が発生する可能性があるので、暫定的な処理とさせてください。実際にこの手法を用いる際にはリスクがあることをご理解の上、実装してください。(今のところ問題が発生するものとしないものの2つのパターンがあることは確認していますが、明確な切り分けは出来ていません。)

private function _onAdd(e:Event):void
{
	_onInit();
	removeEventListener(Event.ADDED_TO_STAGE, _onAdd);
}

一応_onInitの重複発動(Preloader経由だと"Event.COMPLETE"が発動するので)防止のために、"onInit"の最初に以下の一文を入れておく。

if (prog) return;

まだこの状態では"CastDocument"の初期化前にRSLの読み込みが始まってしまいます。(まぁローカルでは問題ないけど)
ということで先にPreloaderでRSLを含む子swf自体を読み込みキャッシュに格納するようにしてみる。

"Preloader"の"_onCastLoadStart"でRSLを埋め込んでいる子swfの読み込みをaddCommandしておく。LoadObjectとかにしておいて、Preloader.progressとかと組み合わせて複合的にLoading状況を表示。
それら一連の処理が終わったらIndexが開始。(もうこの辺はProgressionの素敵なところ)

Indexの方で設定されているRSLの読み込みがFlash内でリクエストされるが、既にPreloaderで子swfが読み込み済みでキャッシュに格納されているので、リクエストは発生しない。

ってな感じでどうだろう?

ちなみにProgressionを使わない場合でも、最近はPreloaderの概念が一般的なので、同じようにRSLを含む子swfを先読みしてから処理すれば良いかと・・・・。(ちなみにCastLoaderのbytesLoadedとかは「そのメディアのロード済みのバイト数です。」と書いてありますが、このそのメディアってのはurlで指定されているコンテンツswfのことを意味します)


ああああああーーーやっとクリア。
問題の切り分けが多くて時間かかったなぁ・・・。
これで心置きなく実装作業に入れる。

ただ本当は埋め込み指定したフォントの共有化が理想なんだけどなあ・・・。
Flexでやれば文字指定でフォントを書き出せるみたいだけど、それもRSLになって無いと、親swfでコンフリクトしてしまうんだろうな・・・。ちょっと今は八方手塞がりな感じだなあ・・・。

PS.
onCastLoadStartで外部ファイルの読み込みを登録すると、それが終わってからindexの読み込みに入るみたい・・パラレルで出来るようにしないと駄目ですね。

PS2.
あら?パラレルとかの問題じゃないのか?
前に作ったときどうやったっけな・・。物忘れがひどいな・・・。

PS3.
なんかしらんけどLoad完了したらLoadObject.loaderがnullになっとる。
って"_commandComplete"でnullになっとるやんけ。こりゃonCompleteで抽出セナあかんねんな。

PS4.
あ、思い出した。前はPreloaderの中ではなくて、PreloaderとIndexをまたいで管理するクラスを作って、そこでそれぞれのLoadingを管理して、そこからIndexの

prog.sync = false;
prog.goto( prog.firstSceneId );	
を叩いていたんだ・・・。

いやー高々2ヶ月前の話なのにまったく思い出せないっつーーー涙

2 Comments

外部フォントswfの作成を mxmlc でやれば、
埋め込むフォント名(fontName)も指定できるので、
コンフリクトを回避できるかと思います。

あんまりいいやり方ではないかも知れませんが。

おお、そうなのですか?mxmlcを使ったことが無いので分からないのですが、FlexとかもfontNameを指定するのでそれと一緒な感じですよね?
ただFlashの方のフォントシンボルの定義ダイアログにも「名前」「フォント(これはインストールされているフォントから選択のみ)」。そしてリンケージプロパティで「クラス名」指定なのではあるのですが・・。

今自分はフォント名とクラス名を一緒にしてしまっているのが問題の原因なのかも・・・汗

ちょっと後で時間できたらまた調べてみます。
ありがとうございました。

Leave a comment

Search and Archives