« 格闘バカ | Home | rain »

Apr 182008

特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0)

ちとplayer9になってルールが変わったのでその辺少し整理しておく。
これはまだAS2の話なのであしからず。

Player9からはこれまでの禁則が緩和され簡単になっている。
やり方は以下のとおり

  1. 本体のFLAを作成。名前を"main.fla"として"main.swf"を書き出すようにする。
  2. フォント埋め込み用のFLAを作る。仮に名前を"share.fla"として"share.swf"を吐き出すように。
  3. share.flaの中に"share"というMovieClipインスタンスを作る。
  4. その中にtextFieldを作成し、埋め込みたいfontで埋め込み文字を設定する。ここでは"ヒラギノ角ゴ Pro W6"で"あほでまんねん"と埋める。
  5. "share"インスタンスを共有書き出しする。ここでは"share"というlinkage nameで、share.swfに書き出す。
  6. main.flaのライブラリで新規シンボル作成。名前を"share"として「ランタイム共有用に読み込み」としてURLに"share.swf"を設定。それをタイムラインに配置。
  7. main.flaに以下のスクリプトを書く
    txf = new TextFormat();
    txf.font = "ヒラギノ角ゴ Pro W6";
    txf.size = "20";
    tx1 = this.createTextField("tx1", 1, 0, 0, 0, 0);
    tx1.embedFonts = true;
    tx1.setNewTextFormat(txf);
    tx1.text = "あほちゃいまんねんばかでんねん";
    tx1.autoSize = "left";
  8. 埋め込まれているfontは"あほでまんねん"なので、main.swf上では"あほちゃいまんねんばかでんねん"ではなく"あほまんねんでんねん"と表示される。(別にstage上に配置されたtestFieldにsetTextFormatでもよいけど)

これまでは同じswf内に同名フォントで設定されたtextFieldが存在していたりするとconflictしてどちらかが表示されないという問題があったが、Player9で書き出しを行えばその辺クリアになっている感じ。

まだplayer ver8で作らないといけない場合は、また話が少しややこしくなる。
fontのconflictが発生するために同じfont nameのtextFieldが使用できなくなる。

conflictの簡単な特徴としては以下のような感じ。

  1. 同じswfファイル内で静的、dynamicTextFieldでlinkageされたものと同じfont名のものが存在すると、先に出てきた方が優先され、あとのTextFieldの文字がレンダリングされない。
  2. ただし外部swfのなかでembedすることは可能。親のconflictの影響は受けない。ただしそのswf内でも前述のconflictの条件は存在する。
  3. attach等をおこなってもconflict条件の対象になる。

といったところ。なのでこの条件が無ければver9と同じ設定で実装は可能。(なはず)

font setとして外部linkageする場合にはlinkage font nameを本来のfont nameと異なる名前にして設定することでこの問題を回避できたのだけど、TextFieldへの特定文字の埋め込みの場合font nameの設定を行う術が無い。

簡単に対応しようと思えば、同じfont nameのものを配置しない。ということになる。 つまり静的TextFieldの文字などをアウトラインにしてしまえばよい。ただ後々修正が入る可能性などを考えるとアウトライン化は避けたいところ。

ではどーするか?
まぁ今更使うこともないだろうけど、一応自分のためにもメモしておく。

簡単に言うと、ダイナミックテキストでフォントを埋め込むTextFieldを共有化して、フォントと同じswfの中に入れてしまう。AS3の概念で言うところのAplicationDomainを同じにする。
手順は以下のような感じ。(※書き出し設定のPlayer version 8の場合)

  1. 本体用の"main.fla"、共有用の"share.fla"を作る。
  2. share.flaの中に"share"というMovieClipインスタンスを作る。
  3. その中にtextFieldを作成し、埋め込みたいfontで埋め込み文字を設定する。ここでは"ヒラギノ角ゴ Pro W6"で"あほでまんねん"と埋める。
  4. 本体でembedFontを埋め込むtextFieldを"share.fla"の方でMovieClip化。書き出し設定しておく。(別にランタイム共有の設定は要らない)仮に名前を"shareTerm"とする。このMovieClipには以下のスクリプトを記述しておく。
  5. share.flaをコンパイルすると、shareTermの中に"あほでまんねん"がembedFontされて表示されるのを確認。
  6. "share"インスタンスを共有書き出しする。ここでは"share"というリンケージ名で、share.swfに書き出す。
  7. main.flaのライブラリで新規シンボル作成。名前を"share"として「ランタイム共有用に読み込み」としてURLに"share.swf"を設定。それをタイムラインに配置。(shareTerm等は"share"の子供として自動的に継承されるので特に個別での設定はいらない)
  8. main.flaの方に
    ref = attachMovie("shareTerm","test1",1);
    ref._y = 0;
    とするとshare.swfの方で作成された"shareTerm"がアタッチされ、フォントもembedされている。
  9. man.flaのタイムラインにヒラギノで何かしら文字を配置してみる。
  10. main.flaを再コンパイルしても表示タイミングに関係なく両方とも表示される。

といった感じ。 このサンプルでは"shareTerm"の方で文字を制御しているが、これだと実用性にかけるので、実際にはshareTermの中には何もスクリプト記述せず。main.flaのほうで以下のようにしてみても特に問題なくfontはembedされる。

txf = new TextFormat();
txf.font = "ヒラギノ角ゴ Pro W6";
txf.size = 10;
ref = attachMovie("shareTerm","test1",1);
ref.tx1.embedFonts = true;
ref.tx1.setNewTextFormat(txf);
ref.tx1.text = "あほでまんねん";
ref.tx1.autoSize = "left";

当然main.swfと同じApplication Dmainの中でconflictが発生している場合には、main.swfと同じApplication Domainの中で上記のembedは行うことは出来ない。(shareTermはmain.swfと異なるapplication Domainということ?)
一方外部swfのなかでembedを行うことも可能。(ただしそのswfのなかでfont nameのconflictが発生していないことが条件)

で更に現実的な運用に対応することを考えると以下のような状態が想定される。

  1. 運用につれて埋め込む文字が変化する。
  2. フォントの更新はクライアントサイドで行いたい。
  3. しかしフォントをembedするパーツなどはクラス管理されているので、そこまで一式で渡すとややこしい

ではどーするか?
ここからは少しトリッキーな使い方なので何か他の問題が起きるかもしれないが、方法としてはfontだけを更にネスとしたリンケージファイルとして存在させるという手段がある。

つまりフォントの埋め込み設定部分を"font.fla"として書き出し、そこでフォントを"font"として共有ライブラリ化。"share.swf"は"font.swf"の中の"font"をリンケージ読み込み。

これを行うと運用に際して更新が必要になるのは単純にフォントが埋まっているfont.flaだけになる。share.fla等クラスが入っているflaファイルを渡す必要はなくなり、運用も簡単になるのではなかろうかと・・・

ま、今更ver8 Playerの話とかしても仕方ないんだけど・・・。

ソースはこちら
for var9 player + as2.0
for var8 player + as2.0

4 Comments

自分で読み返してあまりに意味不明なのでソースをアプしました。

ソースのリンク先がアレげだったのですがhttp://www.img8.com/src/embed_ver9.zip
でいいんですよね?

お、そです。
何だこのリンクは?
直しておきます。
教えてくれてありがとございます。

直しました。リンクからhttp://が抜けていたようです。
ソースもなんかおかしげなところあったら教えてください。

Leave a comment

Search and Archives