スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

KAGEXの文字描画について - layerExDraw.dll

KAGEXでは文字の描画方法が3種類存在します。
知らないと特定の場合に困ることになります。


1つ目は吉里吉里の機能を使った描画です。
KAGの文字描画は全てこれです。
※TJSで表現するとLayer.drawText()で描画させるやつです。
KAGEXでも基本的にはこちらが使われます。


2つ目はlayerExDraw.dllの機能を使った描画です。
「メッセージレイヤへの文字描画、名前レイヤへの文字描画、選択肢への文字描画のいずれかの場合」で、「横書き」かつ「縁取りあり」かつ「アンチエイリアスあり」の時にこちらが使用されます。

↓微妙に違う文字描画(上が吉里吉里による描画、下がlayerExDrawを使った描画、フォントはMS 明朝)
fontcmp.png
layerExDrawによる描画だと、縁取りと影を同時に描画できたり、取り消し線をひけるなど色々と便利な点もあるのですが、困る場合もあります。

それはレンダリング済みフォントが使えないということです。
↓文字化けしてしまいます
exdraw_prerend.png
簡単な解決方法としてはlayerExDraw.dllによる描画を使わないようにすればいいです。
pluginフォルダに入っているlayerExDraw.dllを削除してしまいましょう。
使っているという自覚がなければ他の箇所でも使われていないはずなので消してしまって問題ありません。
※layerExDraw.dllでインストールされていないフォントを使う方法もあるのですがここでは紹介しません。


3つ目はビットマップフォントを使った描画ですがデフォルトでは使われないので気にしなくて構いません。


ついでにTJS的な解説。
メッセージレイヤなどへの文字の描画はMessageLayer.tjsの2429行目あたりで定義されている「MessageLayerクラスのdrawTextToLayer関数」が使われます。
以下該当の関数をコピペ。
00:  function drawTextToLayer(lay, x, y, text, color) {
01:      var win = lay.window;
02:      if (typeof   win.bitmapFont == "Object" && win.bitmapFont) {
03:          var dt = win.bitmapFont.drawTextToLayer;
04:          // ビットマップフォント指定による強制描画
05:          dt(lay, x+shadowOffsetX, y+shadowOffsetY, text, shadowColor) if (shadow);
06:          dt(lay, x, y, text, color);
07:          return;
08:      }
09:      var dt = lay.drawText;
10:      if (!vertical && edge && antialiased && typeof lay.drawPathString != "undefined") {
11:          // layerExDraw拡張
12:          var tag = "__gdiplusfontapp";
13:          lay[tag] = new global.MessageLayer.GdiPlusFontApp() if (typeof lay[tag] == "undefined");
14:          lay[tag].drawText(this, lay, x, y, text, color);
15:      }
16:      else if(edge)   dt(x, y, text, color, 255, antialiased, edgeEmphasis, edgeColor, edgeExtent, 00);
17:      else if(shadow) dt(x, y, text, color, 255, antialiased, 255, shadowColor, shadowWidth, shadowOffsetX, shadowOffsetY);
18:      else            dt(x, y, text, color, 255, antialiased);
19:  }
第1引数layには文字を描画する対象となるレイヤオブジェクトがわたされます。
第2引数xは文字を描画するx座標、第3引数yがy座標です。
第4引数textは描画する文字列、第5引数colorは文字の色です。

1行目、レイヤの親ウィンドウはKAGEXのウィンドウのはずです。
2行目でウィンドウにbitmapFontが存在するか確かめていますが、自分で作らない限り存在することはありません。
※KAGEX側で勝手に作られることはありません。
なので3行目から7行目は無視されます。
8行目、レイヤのdrawText関数のショートカットを作成します。
以下dt()でレイヤのdrawText関数が使えるようになりました。
9行目、上の解説でも触れた「横書き」かつ「縁取りあり」かつ「アンチエイリアスあり」の条件をチェックしています。
verticalは縦書きの時にtrue,edgeは縁取りありの時にtrue,antialiasedはアンチエイリアスありの時にtrueになります。
※それぞれMessageLayerクラスのメンバ変数です。後述のedgeEmphasisなども同様。
最後の「typeof lay.drawPathString != "undefined"」ですが、drawPathStringとはlayerExDraw.dllを読み込んだときに定義される関数です。
「typeof lay.drawPathString != "undefined"のとき」つまり「drawPathStringが存在しているとき」にはlayerExDraw.dllが読み込まれていないと判断できます。
11行目から14行目でlayerExDrawによる描画を行っているのですが、面倒な部分なのでまた今度に回します。
16行目は10行目の条件が満たされないときに縁取りありで描画します。
edgeEmphasisが縁取りの濃さ、edgeColorが縁取りの色、edgeExtentが縁取りの厚さとなっています。
影を文字と同じ位置に描画することで縁取りのように見せかけています。
17行目は縁取りなし、影ありのときの描画です。
shadowColorは影色、shadowWidthが影の幅、shadowOffsetXが影の位置のxオフセット、shadowOffsetYが影の位置のyオフセットとなっています。
drawTextの機能をそのまま使っているだけです。
18行目は縁取りも影もなしでシンプルにdrawTextで文字を描画しています。
※余談ですがMessageLayer.tjsでは「縁取り」と「袋文字」が同じ意味で使われています。
※自分で読むときにはちょっと気をつけてください。
スポンサーサイト

タグ : 吉里吉里 KAGEX TJS

カテゴリ : KAGEX

コメントの投稿

非公開コメント

最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。