2016年 02月 20日
DXライブラリでノベルゲームのシナリオ読み込み処理 [C/C++][DxLib] |
今日はノベルゲームエンジンを使わず、C++だけでやるシナリオ制御についての記事を書きました。
なお、このシナリオ制御は、私が作った自作ノベルゲーム「夜空の贈り物」でも使用しています。
「夜空の贈り物」は以下のサイトで紹介しているので、よかったらプレイしてみてください。
では始めに、ゲーム全体の処理について説明しようと思います。
まず、ゲーム全体の処理の流れは以下のようになっています。
1.シナリオ読み込み
2.クリック監視
3.制御コードチェック
4.背景やキャラクタを描画
5.テキスト描画
6.2に戻る
次に、ノベルゲームのシナリオを制御するカウンタを3つ定義します。
・シーンカウンタ
現在のシーン番号を格納。
・セリフカウンタ
現在のセリフ番号を格納
・テキストカウンタ
現在のテキストの行数を格納。
紛らわしいですが、セリフカウンタは何番目のセリフなのかを指し、テキストカウンタは何行目なのかを指します。
次にシナリオファイルの書き方についてですが、私の場合は以下のようにしました。
キャラ名:セリフ
主人公:セリフ
コメント:テスト(: は半角)
イベント:イベント名
音楽:曲名
背景:背景の名前
キャラ:キャラ名
上から説明しますと、
キャラ名: ゲームのシナリオとして解釈される
主人公: 地の文として解釈され、名前が空白になる
コメント: コメントとして読み飛ばされる
イベント: シーン切り替えなどのイベントを記述
音楽: 指定された曲を再生
背景: 指定された背景に切り替え
キャラ: 指定したキャラを表示
以下がテキストの記述例です。
コメント:「夜空の贈り物」 シーン0
背景:暗闇
音楽:回想
主人公:夕日はもう見えない。
主人公:空はぼんやりと藍色に染まっている。
優介:「もう日が暮れるようになったんだ」
次にシナリオ読み込みの流れを簡単に説明しようと思います。
1.テキストファイルから一行読み込む
2.テキスト内の空白を除去
3.テキストを 名前 と セリフ に分ける
4.読み込んだテキストが空白のみやコメントだった場合飛ばす
5.次の行を読み込む
6.テキストの最後まで読み込んだら、次のシナリオファイルを読み込む
7.1に戻る
こうしてシナリオファイルのテキストを全て読み取ります。
なお、4の 名前 と セリフ というのは : で区切られたものをいいます。
例えば、
優介:「もう日が暮れるようになったんだ」
だったら、"優介"が名前で、"「もう日が暮れるようになったんだ」"がセリフです。
また、
背景:暗闇
の場合も、"背景"が名前で、"暗闇"がセリフになります。
名前とセリフに分ける理由は、大きく分けて2つあります。
・名前とセリフの描画位置を別々に指定できる。
・名前に制御コード名(音楽や背景)、セリフに値(曲名や背景の名前)が入っていると、プログラムで処理がしやすい。
次は描画処理の流れを簡単に説明したいと思います。
1.名前をチェックし、制御コードだった場合そのコードの処理を行い、テキストカウントとセリフカウントを加算し、1に戻る。
2.テキストを描画
3.名前を描画
4.画面がクリックされれば、テキストカウントとシーンカウントが加算され、テキストカウントがシーンの最大まで達すれば、シーンカウントを加算し、その他カウントに0を代入して初期化します。
シナリオ制御については以上です、少しわかりづらくなってしまったかもしれません。
ストーリー読み込み処理に関してのソースコードは公開しますので、参考にどうぞ。
テキストの読み込みにDXライブラリの関数を使用していますが、処理はファイルから一行ずつテキストを読み出しているだけです。
描画処理に関するソースも公開しようと思っていたのですが、少々複雑でうまくまとまっていないので、また後日公開しようと思います。
(ストーリー読み込み処理も綺麗とは言えないですが...)
Name配列が名前で、Text配列がセリフになります。
また、LineNo配列は一つのセリフの行数で、LineMax配列は一つのシーンの行数となっています。
これらの変数はTextClassのメンバ変数です。
一部C++あるまじき書き方がされている箇所がありますが、どうかお許しください。
私は1からノベルゲームのシステムを開発して、ノベルゲームエンジンのありがたみを知りました。
私が必死に開発したシステムは、エンジンを使えば一瞬で実現できてしまうのです。
それでもエンジンに頼らないのは、やはり自分のスキルをもっと向上させたいと思うからです。
まだまだプログラムの書き方が汚かったり、処理が甘かったりすることも多くありますが、もっと深く突き詰められればと思っています。
最後まで読んでくださり、ありがとうございました。
#
by ice_arr
| 2016-02-20 13:33
| プログラミング