フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんにちは。頑ななハードコーディングに定評のあるShiroも、とうとう局所的にテキストの外部ファイル化に踏み切りました。といっても、よく考えたら今までだって画像データやサウンドデータは外部ファイルだったわけで、テキストデータだって同じようにするだけだったんですけどね。

ただ、テキストには他と違う難しさがあります。それは「ファイルの内容をそっくり読みこめばいいわけではない」という点です。そう、ゲームのテキストでは、どうしてもプレイヤーの名前などを埋め込みたい場合が出てきます。そして不死女は名前を任意にしていますから、もちろんその名前を実行時に拾ってきて置換しなければなりません(「俺」「あなた」などでごまかすこともできますが、そうすると名前を任意にした意味がなくなります…笑)。

ではどうするか。ハードコーディングなら、普通にsprintfで%sするだけのことです。しかし外部ファイルからだと、%sとは打つことはできますが肝心の引数を渡せません。

方法① printf系の「引数順指定」を使う
sprintfなどの関数では、「%1$s」のようにすることで使う引数をフォーマット上で選択できるようになっています(ただし直接サポートしている処理系は少なく、例えばVSならsprintf_pという別の関数で対応している)。埋め込みたい文字列の種類というのはたかが知れていますから(むしろ今のところ名前ぐらいしかない)、使いそうな引数をみんな渡しておき、テキスト側で指定すれば必要な文字列を埋め込むことができます。
しかしこれは非常に難しいということがわかりました。なんでも引数順指定を使う際は、「すべての引数を必ず使わなければならない」「同じ引数を違う型で変換してはならない」という制約があるようなのです。これは厳しいです。どう考えても毎回すべての引数なんか使いませんし、ダミーで「%1$.0s%2$.0s%3$.0s…」などとしても、文字列でないものが含まれたらアウトです。どうしてもこの関数を使うなら、予め使っている引数と使っていない引数を調べ、使っていないもののみに対してダミーの変換指定子を付け加える…などということになりますが、こんな複雑なパーサーを作るくらいならもはや簡易sprintfを自作したほうが早いわけで(笑)、引数順指定を使う方法はボツとなりました。

方法② sprintfを作る
①でちらっと書いたのですが、結局文字列置換する関数を自作したほうが良さそうという結論に至りました。ただ、printf系の信頼と実績の変換指定子があるのに、それを一から自作するのはもったいないです。ここで気づいたのは、変換指定子の「%s」「%d」などはデータによって決まっているということです。「プレイヤーの名前を埋め込む」といったら「%s」しかないわけです。よってテキスト側で変換指定子まで決めれるのは冗長であり、むしろテキストを書く側からしたら面倒です。というわけで「プログラム側では「名前と変換指定子と引数」をセットで保持しておいて、テキスト側で名前を指定したら適切にsprintfして埋め込んでくれる」という設計にしてみました。これが大成功。テキスト側では埋め込む場所に名前を書くだけですし、細かい書式指定が必要な場合はプログラム側の変換指定子をそのようにすればsprintfがやってくれます。テキスト中に散りばめられた奇妙な文字列は消え、それでいて必要な自由度は保っている。十分実用的なスクリプトエンジンになったのではないでしょうか。


<本日のスクリーンショット>
動作テストを兼ねて関係ないモデルを読み込ませて遊んでみました。権利関係が怖いので製品版には一切(おまけとかにも)搭載しませんが(ただ、プレイヤーさんが自己責任で用意したモデルを読み込む機能くらいなら付けてもいいかも…?)。
けいおん
関連記事

[2015/03/12 13:32] | 不死女 -Immortal girl-
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。