2007/05/27(日) [n年前の日記]
#4 [prog] Ruby/SDLのSFontの持ち方に富豪的プログラミングを感じた
_Ruby/SDL Users - フォント
4種類のフォント(ttf,bitmapフォント,SFont,BDF)が使えるらしいのだけど。SFontのフォント画像を見て目ウロコ。文字単位で横幅が違うわけだけど、その横幅をどうやって指定するか。 _画像の中に、特定色の線を引く ことで、「ココからココまでが、この文字の横幅」という指定をしてる。 *1
1dotたりともテクスチャ領域を無駄にはできない、家庭用ゲーム機や携帯電話向けのソレとは、発想が違う。「画像の中に文字の横幅の情報も入れちゃえばいいじゃん。どうせメモリもHDDもたくさんあるから、使わないところが数百dotあっても問題なし。CPUも速いんだから処理の重さとか気にスンナ。データ作成作業が楽になるんだから、このほうがいいよ」みたいな。こんなところにも富豪的プログラミングが。たぶん。おそらく。…そもそも Ruby でゲームを作ること自体が富豪的なのか。
それはともかく、SFont以外はちと使い道が限られるな…。他の方法は1色だけなので、文字の縁取りすらできん。と思ったが、位置をずらして何度も何度も重ね描きすれば縁取りはできるのか。これまた富豪的、なのか。
4種類のフォント(ttf,bitmapフォント,SFont,BDF)が使えるらしいのだけど。SFontのフォント画像を見て目ウロコ。文字単位で横幅が違うわけだけど、その横幅をどうやって指定するか。 _画像の中に、特定色の線を引く ことで、「ココからココまでが、この文字の横幅」という指定をしてる。 *1
1dotたりともテクスチャ領域を無駄にはできない、家庭用ゲーム機や携帯電話向けのソレとは、発想が違う。「画像の中に文字の横幅の情報も入れちゃえばいいじゃん。どうせメモリもHDDもたくさんあるから、使わないところが数百dotあっても問題なし。CPUも速いんだから処理の重さとか気にスンナ。データ作成作業が楽になるんだから、このほうがいいよ」みたいな。こんなところにも富豪的プログラミングが。たぶん。おそらく。…そもそも Ruby でゲームを作ること自体が富豪的なのか。
それはともかく、SFont以外はちと使い道が限られるな…。他の方法は1色だけなので、文字の縁取りすらできん。と思ったが、位置をずらして何度も何度も重ね描きすれば縁取りはできるのか。これまた富豪的、なのか。
◎ 個人的には、等幅+多色のビットマップフォントがサポートされていれば、それで充分な気も。 :
なぜ多色かというと。縁取りや影をつけて、背景画像と明確に区別がつくようにしたいから。背景に溶け込んでる文字表示ほど無意味・害悪なモノはない。…時々、雑誌ですら、そういう失態をやっちゃってるけど。
なぜ等幅かというと。例えばの話、得点表示部の横幅が値によってガクガクと変化しちゃったら、ユーザにとってはかえって認知しづらくなるだろうと。極端だけど、同位置で、60fps単位で、「0000」が「1111」になったら、認知に関して混乱するんじゃないか、みたいな。
大事なのは、ユーザにとって「テキストデータ」が「瞬時に取得できるか」どうかであって、文字表示がどれだけ綺麗に見えるかではないような。と思ったけど、文字幅が適切なほうが、「文章」として読みやすい云々ということもあるのか。うーん。いや、だけど、えてしてゲームの文字表示ってのは「変化」するわけで。印刷物のように「変化しない」わけじゃないから、異なる思想・アプローチが必要になるのであろう気もする。…逆に、その文字表示がさほど変化しないなら、印刷物のソレに近づけたほうがいい、ということなのかな。
なんだか、全然動かないけど細かく描いてあるアニメ云々と似たような話であるような印象も。静止画で見たときに綺麗なほうが売れる、ってところがあるのかもしれんか。
つーか、得点表示なんて、ゲーム中にひっきりなしに確認するもんでもないよな…。ゲームオーバーになったときに見るぐらいだし。…ひっきりなしに見る文字表示部分と、そうでない文字表示部分を、意識しながらデザイン・実装する必要があるのかもしれない。
なぜ等幅かというと。例えばの話、得点表示部の横幅が値によってガクガクと変化しちゃったら、ユーザにとってはかえって認知しづらくなるだろうと。極端だけど、同位置で、60fps単位で、「0000」が「1111」になったら、認知に関して混乱するんじゃないか、みたいな。
大事なのは、ユーザにとって「テキストデータ」が「瞬時に取得できるか」どうかであって、文字表示がどれだけ綺麗に見えるかではないような。と思ったけど、文字幅が適切なほうが、「文章」として読みやすい云々ということもあるのか。うーん。いや、だけど、えてしてゲームの文字表示ってのは「変化」するわけで。印刷物のように「変化しない」わけじゃないから、異なる思想・アプローチが必要になるのであろう気もする。…逆に、その文字表示がさほど変化しないなら、印刷物のソレに近づけたほうがいい、ということなのかな。
なんだか、全然動かないけど細かく描いてあるアニメ云々と似たような話であるような印象も。静止画で見たときに綺麗なほうが売れる、ってところがあるのかもしれんか。
つーか、得点表示なんて、ゲーム中にひっきりなしに確認するもんでもないよな…。ゲームオーバーになったときに見るぐらいだし。…ひっきりなしに見る文字表示部分と、そうでない文字表示部分を、意識しながらデザイン・実装する必要があるのかもしれない。
◎ _"SFontとか簡単に自動生成できるだろ?" そう思ってた時期が俺にもありました…。 :
文字の見た目からすると、問題が出るのはえてして「"」の部分ぐらいだろうから…。右端から空白を数えていって、その総数が「あるべき空白の数」と一致してない場合はどこかで余計な空白を入れちゃってる = たぶん「"」を2つに分けちゃってるから左端からン番目の空白だけノーカウント→空白総数が一致したらビンゴ、として処理するのはどうかという電波が。
空白の総数と一致するまで総当りで空白を入れていって思いつく限りのパターンを全部出力して人間に選ばせるとか、画像の横幅を文字数で割って、その値(幅)を頼りに処理していくという電波も。
既に存在するフォント画像に対して処理をするのではなく、最初から1文字ずつ作らせて両脇に空白の印を入れて、後で全部連結するのはどうか、という電波も。
空白の総数と一致するまで総当りで空白を入れていって思いつく限りのパターンを全部出力して人間に選ばせるとか、画像の横幅を文字数で割って、その値(幅)を頼りに処理していくという電波も。
既に存在するフォント画像に対して処理をするのではなく、最初から1文字ずつ作らせて両脇に空白の印を入れて、後で全部連結するのはどうか、という電波も。
*1: 正確には逆で、文字の横幅ではなく空白の位置と長さを指定してるけど。
[ ツッコむ ]
以上です。