初めまして。periperiと申します。
現在DxLibを使用してノベルゲームプログラムを作成しています。
ゲーム内で画面にテキストを表示する際、特定の文字にフリガナを付ける処理を実装したいと考えています。
ただ実装をしようと思ったものの実際に作り始めると非常に手間がかかることが想像できるので、
まずは良い実装方法はないかと皆様にお尋ねしたいと思います。
まず、ベースとなる文字表示の機能は、ISLe様のブログ記事を参考にし、表示対象のテキストを外部ファイルから読み込むよう変更しています。
(ISLe様独自のフレームワークは使用しないようにしていますが、勉強段階なので、
それ以外はほぼ記事内のコードをそのまま使わせていただいています。
ISLe様、ありがとうございます。)
ISLeのビデオゲーム工房 ノベルゲーム風に一文字ずつ表示する
http://isle.cocolog-nifty.com/blog/2011 ... -794a.html
フリガナ付き文字列の記述は以下のような形を考えています。
案1. 単語に対し、自由な長さのフリガナを設定できる。
フリガナが長くなると、元となる文字の行間をフリガナの長さに応じて開ける必要が出てきます。
記述例. ぼくは[特急]{エクスプレス}に乗ったよ。
案2. 漢字1文字に対し、3文字までのフリガナを付けられるようにする。
直前の漢字に対するフリガナを記述します。
行間を調節する必要がないので案1よりは簡単ですが、4文字以上のフリガナが使用できなくなります。(スペースの問題で)
案1が難しく挫折した時に実装します。
記述例. ぼくは特{エクス}急{プレス}に乗ったよ。
ただ、どちらも対象の文字[]{}を探索し、その後フリガナの表示位置を計算する必要があり、
実装はそれなりに大変になることが予想できます。
(フリガナ用バッファも、どう作るのがベストなのかわかりませんし…)
私なら案1の方法が分からないので、案2を採用して、
フリガナのフォントサイズをベースとなるフォントの1/3にし、フリガナの無い文字の箇所にはスペースを埋め、
フリガナ対象の箇所のみに文字を入れたバッファを用意し、ベーステキストの1文字目の上から描画を始めます。
ただ、この方法ではベーステキストのフォントサイズか3の倍数でないと
フリガナの位置がずれてしまいます。
もしこのような仕組みを作られた方がいらっしゃれば、どう作ったのか、どう実装すべきなのか、
また参考にされたサイトやサンプルコードがありましたら、ご紹介いただけたらと思います。
長くなってしまいましたが、よろしくお願いします。
文字にフリガナを付ける方法(DxLib)
Re: 文字にフリガナを付ける方法(DxLib)
どうしてもそのような表示にこだわるのなら別ですが、「漢字(フリガナ)」というような記述ならコードも外部ファイルもより簡単なものになるんじゃないかと思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 文字にフリガナを付ける方法(DxLib)
吉里吉里がふりがな機能を持っていますので、それを参考にしてはどうでしょうか。
オープンソース版が有るのでソースコードを参考にできます。
※ そのままコードを盗用すると著作権違反になりますが。
オープンソース版が有るのでソースコードを参考にできます。
※ そのままコードを盗用すると著作権違反になりますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 文字にフリガナを付ける方法(DxLib)
ご意見ありがとうございます。zxc さんが書きました: どうしてもそのような表示にこだわるのなら別ですが、「漢字(フリガナ)」というような記述ならコードも外部ファイルもより簡単なものになるんじゃないかと思います。
画面に表示する際に、フリガナを漢字の上ではなく、
カッコ付けで漢字の横に表示する、ということでしょうか。
申し訳ありませんが、仕様としてフリガナを漢字の上に表示することは避けられないので、
この方法を取ることはできません。
Re: 文字にフリガナを付ける方法(DxLib)
ありがとうございます。softya(ソフト屋) さんが書きました:吉里吉里がふりがな機能を持っていますので、それを参考にしてはどうでしょうか。
オープンソース版が有るのでソースコードを参考にできます。
※ そのままコードを盗用すると著作権違反になりますが。
吉里吉里はオープンソースだったのですね。
フリガナ機能があることは知っていましたが、ソースコードが公開されていることは知りませんでした。
帰宅次第調べてみます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 文字にフリガナを付ける方法(DxLib)
ちなみに案1も案2も実装できます。
作ると少々時間がかかるのでサンプルは示せませんが、DXLIBでは表示前に文字列の取るドット幅を調べることが出来るのでそれを使えば表示位置を微調整できます。
この文字列処理が外せないキモならば、一週間以上かけても実装すべきだと思います。
作ると少々時間がかかるのでサンプルは示せませんが、DXLIBでは表示前に文字列の取るドット幅を調べることが出来るのでそれを使えば表示位置を微調整できます。
この文字列処理が外せないキモならば、一週間以上かけても実装すべきだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 文字にフリガナを付ける方法(DxLib)
ブログのコードはサンプルコードということもあって表示用バッファがベタな配列ですが、一行分を、ルビをふる部分で分割したリスト構造にすると良いかと思います。
描画されるピクセル幅を求める処理を、リストに対し繰り返し、合計するようにします。
その際、漢字とルビのどちらが長いかを選択する仕組みを作って、描画でも利用できるようにしましょう。
文字が追加される最後の項目以外は、一度求めたピクセル幅を記録して再計算を省くようにすると良いです。
DXライブラリの場合は、速度的に毎回求めても問題になることはないと思いますが。
文字の均等割り付けもめんどうくさい処理なので頑張ってください。
一行分のリストとフラグなどをセットにして、ルビのあるときだけ行間を広げるといったこともできます。
均等割り付けを除いては、属性を持たせて、部分的に文字の大きさを変えるなどの装飾にもそのまま応用可能です。
描画されるピクセル幅を求める処理を、リストに対し繰り返し、合計するようにします。
その際、漢字とルビのどちらが長いかを選択する仕組みを作って、描画でも利用できるようにしましょう。
文字が追加される最後の項目以外は、一度求めたピクセル幅を記録して再計算を省くようにすると良いです。
DXライブラリの場合は、速度的に毎回求めても問題になることはないと思いますが。
文字の均等割り付けもめんどうくさい処理なので頑張ってください。
一行分のリストとフラグなどをセットにして、ルビのあるときだけ行間を広げるといったこともできます。
均等割り付けを除いては、属性を持たせて、部分的に文字の大きさを変えるなどの装飾にもそのまま応用可能です。