■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第35夜:コンフィグレーション 今回は、いままでテキストエンジンの中でデフォルト値として扱ってきたいくつかの項目を、コマンド上から変更できる可変パラメータに変更します。何を目的にしているかといいますと、多少のコンフィグレーション機能を持たせることで、同一の実行ファイルでも見た目に変化をつけられるようにしよう、ということです。コンフィグレーション(configuration)とは直訳すると外形/輪郭という意味ですが、ソフトウェアの世界では起動時のオプション設定機能を指すことが多いようです。
ここで想定しているのは、起動時に最初に読み込まれるデフォルトスクリプトを、たとえば
config.txt というファイルにしておいて、ゲーム本来のスクリプトにはこの config.txt から飛んでいく仕様にすることです。つまりスクリプター(ノベルのスクリプトを組む人)に初期化の一部を開放してあげる、ということですね。もちろん、コマンドそのものはスクリプトのどこからでも呼べますから、ゲームの途中でフォントサイズや色を変えることも自由にできます。 上記 1〜3のパラメータは、今までのソースではグローバル変数として存在し、いずれも TextEngine.cpp に記述されています。4はローカル変数として存在しています。今回はそれぞれのパラメータに専用の変更コマンドを実装していきます。コマンドといっても、スクリプトからパラメータ値を読み込んでセットするだけなのでウルトラ簡単な部類です(だからまとめて取り扱うのですが ^^;)。書式としては以下のようなもので良いでしょう。 |
書式:#set_font_size n
書式:#set_text_area sx,sy,ex,ey
書式:#set_text_wait n
書式:#set_text_color r1,g1,b1,r2,g2,b2
|
では、実際にインプリメントしてみましょう。いずれも一発終了型のコマンドで、Mainloop で参照しているフラグ構造体 Mode_stat には無関係です。ソースはこちらを参照して下さい。 ■フラグ Mainloopで参照している構造体 Mode_stat のメンバに追加はありません。 ■コマンド解析部 TextEngine.cpp の Command_call() に、以下の要領でコマンド追加を行います。 |
void Command_call() {
|
■グローバル変数 Text_engine() 内でローカル変数扱いだったテキストカラーを、グローバル変数にしておきます。とりあえず、これで今回手を加えるパラメータはすべてグローバル変数となりました。(構造体にまとめても良さそうですけど、面倒なのでこのままでいいや・・・笑)文字色パラメータを使用しているのは Text_engine() だけですので、リスト変更もそこだけです。 |
unsigned char TEXT_BUF[SIZE_OF_TEXT_BUF];
//スクリプトを読み込むエリア int Font_Size; //フォントサイズ int TEXT_WAIT; //1文字表示のウェイト DWORD TEXT_TIMER; //タイマー int Text_engine()
} |
では、各処理を具体的に実装してみましょう。コマンドが増えてきましたので、新たに Text_Com_04.cpp というファイルに記述していくことにします。 ■フォントサイズの変更:実行部 フォントサイズの変更は・・・単にスクリプトの引数を読んでセットしているだけなので解説は不要ですね(笑)。一応、フォントサイズが変わると文字送りピッチも変わるので、一緒に計算させています。フォントサイズ情報は最終的には CreateFont() に渡されて処理されるので、ここでは特にリミッタは記述しません。サイズ 0 の場合は自動的にWindowsのデフォルトフォントサイズが適用され、また巨大なサイズが指定された場合はシステムで使用できる最大のフォントが適用されます(・・・と、資料には書いてあります:爆死 ^^;) |
int Com_set_font_size() {
|
■テキスト表示エリアの変更:実行部 テキスト表示エリアを変更する #set_text_area コマンドは矩形領域を指定する為に4つの座標パラメータを持っています。表示エリアの変更は、これらのパラメータを順次解析して値の妥当性をチェックし、グローバル変数に代入するだけです。値の妥当性としては、とりあえずエリアの縦サイズはフォントサイズ以上、横サイズはフォントサイズ×4以上(まさか一度に1文字しか表示しないノベルやADVはないだろう・・・とゆー次第で適当に ^^;)に設定しています。値が大きい分には無制限ですが、まさか 10000×10000 ・・・なという指定をする人はいないだろう、と良心的に解釈しておきましょう(笑)。エリアを変更したら、文字位置カウンタを新エリアの右肩位置(=表示スタート位置)に移動します。 |
int Com_set_text_area() {
} |
■テキスト表示ウェイトの変更:実行部 これも単純ですね。パラメータを読んで妥当性チェックをして変数に代入です。ウェイトはあまり大きな値を許容してハング状態になっても困りますので、とりあえず5秒(=5000msec)以上の値は受け付けないようにしておきましょう。現実的には1文字200〜300ミリ秒くらいが読者の限界のような気がしますけど…(笑) |
int Com_set_text_wait() {
} |
■テキストカラー変更:実行部 テキストカラーはRGB各色8bit=1600万色を2セット(文字色、影色)指定可能としますので、パラメータが6個もあります(そんなに色数用意してどーすんねん、という気もしますが ^^;)。とはいえ、パラメータ解釈→妥当性チェック(各チャンネル0〜255の範囲か?)→代入という基本的な流れは同じです。 |
int Com_set_text_color() {
} |
さて、いかがでしたでしょうか。今回のような「代入系」のコマンドは構造も簡単で練習素材としては最適だと思います。パターンさえ掴んでしまえばいろいろな応用が効きそうですね。↓サンプル画像を下に示しますが、処理は単純でもコンフィグレーション機能があるのと無いのとでは印象が随分違ってくることが分かると思います。そんな訳で、また次回♪(^0^) |
![]() ![]() ![]() ![]() |