Hatena::ブログ(Diary)

土屋つかさのテクノロジーは今か無しか

2013-12-02

汎用テキストレイヤライブラリ「Dxruby_text_layer」のご紹介

DXRuby Advent Calender 2013の3日目です。

 2日目の記事はmirichiさんのWindow.draw_morphを使うでした。ホーミングレーザー超かっこいいな!

自己紹介

 初めまして、土屋つかさ(TwitterID:@t_tutiya)と申します。元SE、元ゲームプランナー、現ライトノベル作家ゲームデザイナーをしております。著作についてはこちらあたりでご確認下さい。最新作は秋葉原に実在するメイド喫茶シャッツキステノベライズした「The Stories of Schatzkiste 〜私設図書館のメイドたち〜宝島社)」になります。

 rubyはゲームプランナー時代にチーム内のデータ管理用Webシステムをrubyで書いていた先輩がいて、それに影響を受けて言語を勉強し、別のチームに異動した際に今度は土屋がWebシステム(その時はRoR+MySQL)を作ったりしました。現在は、Ruby+DXRubyで同人ノベルゲームを作るべく、そのライブラリ作りを仕事の合間にちょっとずつ進めています。

 余談ですが、SE時代はIEASP(VBScript)+VBSQLServerという純Microsoftな環境で社内Web書類稟議システムの開発とかしていました。最初に本格的に学んだOOP言語はC++ですが、実務ではPCノベルゲームエンジン開発の初期お手伝いを1回したのみで、あとは同人ミニゲームを作ったくらいです。3D開発経験はありません。

 余談その2。今まで職歴を書く機会がなかったのですが、上記のような感じなので、テクニカルライティングのお仕事もお待ちしています(コーディング/ライティング能力については今回紹介するクラスライブラリのコードやドキュメントをご覧頂ければと思います)。ご興味ある方はウェブ公開用のメールアドレス(skip081-nowornever☆yahoo.co.jp(☆→@))までご連絡下さい。「Ruby&DXRubyで初めてのゲームプログラミング!」的な本を本気で書きたいと思っています!><

 今回は、そのライブラリ作りの成果の一つである、Dxruby_text_layerをご紹介したいと思います。

Dxruby_text_layerが必要な理由

 Dxruby_text_layerは、DXRuby上で動作し、汎用的に使用できるテキストレイヤを目指して設計されたクラスライブラリです。文字の描画に特化しており、それ以外のことはできません。テキストレイヤと書いていますが、単体ではレイヤの背景画像を描画する機能も、キー入力待ちアイコンを表示する機能もありません。文字が描画できるだけです。

 「ただ文字を描画するだけなら、DXRubyでImage#draw_fontを使うだけでしょう? クラスライブラリが必要なの?」と思う方もいるかもしれません。確かにその通りです。けれど、自作のゲームでちょっと凝ったテキストレイヤを表示させようとすると、すぐにそれが恐ろしく面倒な作業であることに気づくと思います。

 例えば、東方風のSTGを作り、ステージ開始時にキャラAとBの掛け合いを2行分の幅を持つテキストレイヤで表示させたいとしましょう。仮にキャラ絵やその他の要素について考えないで良い物として、掛け合いのテキストのデータを、どうやって持つのが良いでしょうか? そしてどう実装しますか? なんとなく考えてみて下さい。

 まず、テキストレイヤが2行あるので、文字以外に改行を指示する必要があります。台詞のたびに必ず2行使うとは限らないので、どこでレイヤをリセット(つまり改ページ)するのかの指示も必要でしょう。キャラAとキャラBのどちらが喋っているか区別するために、台詞によって文字色を変えましょうか。そうだ、難しい当て字を使った時のためにルビも振りたい!

 もう少し欲を出します。文の途中で文字サイズを変えたい場合、全ての文字を下揃えにするにはどうすれば良いでしょう。タメを表現するために、ある文字の後だけ60フレ待つようにできないでしょうか。あと、1行まるごと表示するのではなく、2フレ置きに1文字ずつ表示させると商業ゲームっぽいですね。あ、それも、1文字ずつフェードインしながら表示させられたらもっと綺麗かも!

 プレイアビリティへの配慮も必要です。文字描画速度はコンフィグでユーザーが指定できるようにしたいですね。あと、描画途中でボタンが押されたら、1文字単位描画はスキップして最後まで一気に描画されるとサクサク進んで良いかな。リトライのたびに同じ掛け合いを見たくはないので、既読テキストは当然スキップできるようにしたいですよね。それからそれから――!

 どうですか。そろそろうんざりしてきませんか? 途中から「え、1文字ずつ指定フレーム待って表示させるの? たかが文字表示なのに妙に面倒なコードを書かなきゃいけないんじゃないか……? それに、途中で色やサイズを変えるって、その文字装飾の指定ってどんな書式にして、どうデータ管理すればいいんだ? え、スキップ機能まで必要なの!?」みたいな気分になってきたのではないでしょうか。

 これらの処理をまるっと担当するのがDxruby_text_layerなのです。上記で書いた機能を筆頭に、テキストレイヤに必要と思われるロジックは大方組みこんであります。実質的に独立したクラス一個で出来ているので、たった今から、あなたが作っているゲームに高機能テキストレイヤを組み込むことができます。

 一応付記しておきますと、特に技術的になにか斬新であるとか、新機軸であるとかいう所はありません。他のゲームライブラリでも大なり小なりこういう機能セットが用意されていると思います。そのDXRuby用が本ライブラリだと考えて下さい。

特色

 Dxruby_text_layerは、商用ゲームのテキストレイヤと同レベルの表現力を持つこと目指して開発しています。上で書いたことは全部実現できますし、他にも多数の機能を持っています。特に、以下の2点については、他のフリーゲームライブラリruby以外の環境も含む)では(めんどくさいから)実装されていないのではないかと思っています(あったらごめんなさい)。

  • 1文字ごとのフェードイン表示(参照
  • 読み終わった文字列の半フェードアウト(参照

 参照先にある「ロボティクスノーツ」と「魔法使いの夜」は、どちらもDxruby_text_layerを実装するきっかけになったゲームです。どちらもとても繊細な文字描画処理を行っているので、興味ある方は是非実機で確認することをオススメします。

 また、DXRuby 1.5.0devの新機能に対応し、任意の画像や、予め生成したレンダリング済みフォントデータファイルを読み込んで、それらを通常のフォントと透過的に扱うことが出来ます。これは、Dxruby_text_layerを介することで文字処理メカニズム抽象化される好例かと思います。

 あと、これはDxruby_text_layerの機能ではありませんが、Image#draw_font_exは袋文字に対応しています。袋文字はDirectXの機能にはなく、DXRubyが自前で計算して出力しています。元は吉里吉里/KAGで実現されていた機能で、是非にとお願いして実装して頂きました。これは、ruby内の他のゲームライブラリと比較して、DXRubyの大きな特徴だと思います。

動作の仕組み

 Dxruby_text_layerでは、テキストレイヤへの文字の描画を筆頭に、改行や遅延速度の変更などのあらゆる指示を「コマンド」として管理します。テキストを表示させる際には、Dxruby_text_layerオブジェクトを生成し、必要な分だけコマンドをそのオブジェクト内にスタックさせておきます。

 あとは毎フレームごとに処理メソッドを呼び、かつ、必要な時にImage(実際にはRenderTaget)を取得すれば、必要な処理が施されたテキストレイヤが手に入るという寸法になっています。

本体とマニュアル

 こちらのサイトで本体をDLします。

 マニュアルはこのブログに掲載されているので参照して下さい(上記のサイトに目次があります)

活用方法

 簡単な使い方を含むイントロダクションを書いたので参照して下さい(イントロダクションの目次も上記のサイトにあります)。スクリーンショットもあります。「文末に来たらキー入力を待つ」とかはDxruby_text_layer自身は機能として持っていないので、それらを実現する方法を説明しています。

 また、Dxruby_text_layerは「文字は1文字ずつコマンドとして登録しなければならない」という仕様なっています。その為、文字列を1文字単位に分解しなければならず、これが正直対応するのが面倒だと思うのですが、イントロダクションで書いたサンプルで、このあたりをどう処理するかについての実例を示していますので、参考にしてもらえればと思います。

 ちなみに、なんでこういう仕様になっているのかと言いますと、「文字列を文字に分割する」という作業は、ゲームエンジン側に依存すると考えているためです(実際、土屋が作っているノベルゲームエンジン「RAG」では、スクリプトパースする時点で1文字ずつ抽出されます)。rubyでは文字分割は簡単なので、これでもまあいいかなと。

終わりに

 「テキストを表示する」という処理は、どんなゲームを作るにしてもほぼ必須の実装だと思います。そして、多少でも文字描画の見栄えをよくしようとすると、たちまちロジックが複雑化する領域でもあります。逆に、テキストレイヤの見栄えが良いと、ゲーム全体の(見た目の)クオリティを一段引き上げられるだろうとも思っています。

 Dxruby_text_layerは極めてプリミティブな処理しか用意されていないライブラリですが、その代わり、どんなゲームを作る際にも容易に組み込むことが可能で、あなたのゲームにとてもリッチなテキストレイヤ機能を提供します。どうぞ、使ってみて下さい!><

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証