mieki256's diary



2014/12/05(金) [n年前の日記]

#1 [dxruby] DXRubyと絵文字

気づいたら _DXRuby Advent Calendar 2014 の予定が全部埋まってたので、なんだか一安心。埋まってくれて良かったです。

…実は、万が一全部埋まらなかったら、こういうしょーもない記事でも押し込んでしまおうかしら、空いてるよりはマシだろう、などと思ってチビリチビリと書いてたのでした。せっかく書いたことだし、ちょっともったいないから、こうして一応公開。と言っても、内容は _2014/03/29の日記 の焼き直しなので(´・ω・`)なのですけど。

DXRubyと絵文字 :

DXRubyを使ってサンプルスクリプトを書く時、こんな感じで書くわけですけど。

_sample1.rb
require 'dxruby'

img0 = Image.new(96,96, C_RED)
img1 = Image.new(96,96, C_CYAN)

Window.loop do
  break if Input.keyPush?(K_ESCAPE)
  Window.draw(160, 120, img0)
  Window.draw(320, 160, img1)
end
emoji_ss1.png

「なんだかちょっと寂しいなあ…」と思うわけですよ。それに、画像の向きも分からないから、回転させてもどっち向いてるかよく分からなくて、動作確認用としても少し困るし。

そこで、最初のあたりをちょっと書き換えてみたりして。

_sample2.rb.txt
img0 = Image.new(96,96, C_RED)
img1 = Image.new(96,96, C_CYAN)

# ↓

img0 = Image.new(96, 96).drawFontEx(0, 0, "\u017d", Font.new(96, "Webdings"), :color => C_RED)
img1 = Image.new(96, 96).drawFontEx(0, 0, "\u004d", Font.new(96, "Wingdings"), :color => C_CYAN)

emoji_ss2.png

ちょっとは楽しそうな見た目になったかな? え? 相変わらず寂しい? いやいや、四角だけよりはマシでしょう…と思うんだけど。

てなわけで、この記事は終わりです。以上!

補足情報。 :

ダラダラ続けます。

上のソレ、やってることは、Image.new() で画像を作った直後に、.drawFontEx() で「絵文字」を描いてるだけです。
img0 = Image.new(96, 96).drawFontEx(0, 0, "\u017d", Font.new(96, "Webdings"), :color => C_RED)
「"\u017d"」てのは、「Unicodeで何番目の文字か」を指定してます。ここを変えれば違う絵文字を選べるわけですな。Ruby 1.9 以降ならこの書き方ができるそうです。

また、Windows には最初から、以下の絵文字フォントが入ってますので、これらのフォント名を指定すれば絵文字が使えます。
  • "Wingdings"
  • "Wingdings 2"
  • "Wingdings 3"
  • "Webdings"
  • "MS ゴシック"
「MS ゴシック」も、ところどころに絵文字がある(U+2500あたりに並んでる)ので書いておきました。

どんな絵文字があるかは、 _IMEパッド を開いて確認することができます。

しかしですね。仕組みを説明するサンプルスクリプトの類なら、ソースをパッと見で何をやってるか分かりやすくしないといけないので、こういう余計(?)な小技を使うのもどうかと思うわけですよ。なので、こういうソレは実際には使わんだろうなと。

でもまあ、それでも、「見た目をもうちょっとどうにかしたいよなあ」「だけど画像を添付するのもアレだなあ」「ドット絵を描くのも面倒だなあ」てなときには使えるかもしれません。

補足情報その2。 :

「〜なときには使えるかもしれません」と書いてみたものの。「ホントに使えるのかよ?」と不安になってきたのでした。

そこで試しに、絵文字だけでミニゲームっぽいものも書いてみました。

  • プレイヤーキャラをカーソルキーの左右で動かして、ドクロマーク以外を取るミニゲームです。
  • ドクロに当たると点数が0点になってしまいます。
  • クソゲーです。クソゲーです。大事なことなので2回言いました。
_sample3_game.rb.txt
emoji_game_ss.gif

うむ。見た目は悪くないんじゃないかな。

ちなみに、これが四角になると…。

emoji_game_ss2.png

…アレ? これはこれでアリなんじゃ…。アレレ? まあ、判断は読者に委ねます。と、お茶を濁したりして。

DXRubyとLigature Symbols :

絵文字を出す時、指定が分かりづらいですね。「"\u017d" とか書かれても、何が出てくるのかわかんねえよ!」と言われそうです。

もしかすると、Ligature Symbols フォントを使えば、そのあたり少しは解決するかもしれません。

_Ligature Symbols
_【レビュー】キーワードをタイプすることで印字可能な絵文字フォント「Ligature Symbols」 - 窓の杜

どういうフォントかというと、「mail」と書けばメールの絵文字が出てくる不思議な(?)フォントです。

DXRubyでも使えるか実験してみました。

_sample4_ligaturesymbols.rb.txt
# LigatureSymbolsフォントをDXRubyで表示できるかテスト

require 'dxruby'

# カレントフォルダに置いたttfを一時的にインストール
Font.install("./LigatureSymbols-2.11.ttf")

fnt = Font.new(72, "LigatureSymbols")
sz = 72 + 4

Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  chrlist = [
    "mail", "delete", "clear", "camera", "image", "playmedia", "bell",
    "color", "light", "dark", "keyboard", "time", "car", "bus",
    "grab", "setting", "wink", "smile", "trouble", "surprise",
    "man", "woman", "game", "home", "heart", "heartempty",
    "gift", "umbrella", "android", "apple", "github",
    "aim", "chrome"
  ]

  x, y = 4, 4
  chrlist.each do |s|
    Window.drawFont(x, y, s, fnt)
    x += sz
    if x > Window.width - sz
      x = 4
      y += sz
    end
  end
end

emoji_ss5.png

単語をずらずらと drawFont() に渡してますが、表示されているのは絵文字ですね。うむ。表示できるようですよ。

ただ、Ligature Symbols フォントの ttf ファイルを、スクリプトに同梱しないといけないのがアレですね。「画像を同梱したほうが確実だし早いだろ…」と言われそうですなあ…。

でもまあ、ファイルサイズについてはメリットがありそうです。Ligature Symbols フォントの ttfファイルは、たったの 81.4KByte。これっぽっちのファイルサイズで、色んな画像が出せるわけで。

あくまで夢想レベルですが…DXRubyに標準で画像を内包させる、なんて話になった時は、こういう方法でデータを持っておくのも手かもしれないよなあ、てなことをチラリと思ったりもします。元がベクターデータだから、得られる画像サイズは自由自在だし。データファイルサイズも少なくて済むし。利用時は、意味が分かる単語を指定できるので、ソースも分かりやすくなるし。

多色化できないのが難点ですけど(木亥火暴)

今回使ったスクリプト・フォントファイル :

今回使ったスクリプトやフォントファイルの一式を以下に置いておきます。

_font_disp_unicode_20141205.zip

スクリプトは Public Domain。フォントファイルは各フォントのライセンスに従う、ということで。common_icons.ttf、LigatureSymbols-2.11.ttf、どちらもOFL(SIL Open Font License)のはずです。

2014/12/06追記。 :

DXRubyの作者様が、このお遊び(?)について興味深いお話をされてましたので、せっかくですから引用させていただきます。

Image#draw_exで描画してるから1.4.1でも動いてるけど、これがWindow.draw_fontで描画してたら"\u017d"が描画エラーになるという困った問題がある。

mirichiさんはTwitterを使っています より

Window.draw_fontでエラーになるのはSJISに存在しないコードだからであり、基本的には内部SJISなので色々と問題がある。1.5devではIME対応のついでに内部UNICODE化したのでこれが動くようになっている。はず。

mirichiさんはTwitterを使っています より

じゃあなんでImage#draw_exは動くのかというと、1文字ずつフォントのグリフを取得する処理を簡単にするためにここだけUNICODEに変換してるからなのだな。Window.draw_font以外はこの処理が入ってるので動く。

mirichiさんはTwitterを使っています より


マジすか。手元でも早速試してみたところ…。
require 'dxruby'

fntwebdings = Font.new(96, "Webdings")

Window.loop do
  Window.drawFont(10, 10, "\u017d", fntwebdings)
end
> ruby sample2_b.rb
sample2_b.rb:8:in `encode': U+017D from UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
        from sample2_b.rb:8:in `drawFont'
        from sample2_b.rb:8:in `block in <main>'
        from sample2_b.rb:7:in `loop'
        from sample2_b.rb:7:in `<main>'
ホントだ。Window.drawFont() でコレをすると、エラーになるのか…。自分、「毎フレーム文字書いてたら遅くなるやろ。ここは画像にしておくべし」的に何も考えずやってたけど、エラーを回避するルートを偶然選んでいたのですな。

そして、驚愕の事実が。
UNICODEの合字に対応した覚えは無いのでLigature Symbolsが使えるとは思えないのだが、はて、なんでWindow.draw_fontで描画できてるんだろう。

mirichiさんはTwitterを使っています より

( ゚д゚) エエー

何故動いてるんだ、コレ…。まあ、DXRubyの七不思議の一つ、てことにしちゃ…ダメですかね…。

ちなみに、Windows7 x64 上で、GIMP、メモ帳、Paint.NET は Ligature Symbols が使えてますが、LibreOffice、Inkscape、Word 2003、Word 2007 では使えないので、たしかにアプリによって、合字フォントへの対応・未対応が違うようです。OSが全てイイ感じにやってくれるわけではない、ってことなのかしら。

DXRuby の場合、DirectX がイイ感じにそのへんやってくれてるとか? と思って「directx 合字」「directx ligature」でググってみたけど何が何やら。うむ。七不思議です。

以上です。

過去ログ表示

Prev - 2014/12 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project