【ウディタ】マウス操作ゲーム自作解説⑨~ゲーム設定の保存~

レビニアよ。今回は前回と前々回で作成したゲーム設定の記録、つまりセーブ&ロード処理を作成するわ。

音量だの文章速度だのをゲーム中に変更したら、それを保存して次回のゲーム起動時に適用されなきゃいけないわよね。それを作るのよ。

※ちなみに当解説にはマウス関連の内容はまったくないわ。まぁ設定画面のマウス操作を作ったんだし、一応は関連情報ということで。

ゲーム設定のセーブ&ロード処理を作成する


それじゃゲーム設定をセーブ&ロードするコモンを作成していきましょう。
コモン作成:名前「┗ゲーム設定S/L」、起動条件「呼び出しのみ」


入力設定には、コモン実行時にセーブとロードどちらの処理を行うかの選択肢を作成してね。


条件分岐でセーブとロードそれぞれの処理を分けるのよ。
■条件分岐(変数): 【1】 CSelf0[処理内容] が 0 と同じ 【2】 CSelf0[処理内容] が 1 と同じ
-◇分岐: 【1】 [ CSelf0[処理内容] が 0 と同じ ]の場合↓
|■
-◇分岐: 【2】 [ CSelf0[処理内容] が 1 と同じ ]の場合↓
|■
◇分岐終了◇

ゲーム設定のセーブ処理を作成する


まずはセーブの処理から作っていくのだけど、セーブする設定内容を書き出すためのセルフ文字列を1つ用意してね。

ちなみにどうやってゲーム設定を保存するのかというと、セーブ/ロードのイベントコマンドではなくて、文字列操作コマンドによるテキストファイルへの書き出しで行うのよ。


最初に文章速度と音量を格納しているシステム変数の値をセルフ文字列に書き出す
■文字列操作:CSelf5[設定内容] = “\sys[9]\n\sys[100]\n\sys[101]\n\sys[102]”


こんな感じで特殊文字でシステム変数の値を一旦セルフ文字列に書き出して、


それを文字列操作コマンドでファイルに出力
■文字列操作:CSelf5[設定内容] =<を→のファイルに出力> “Save/sysconfig.ini”


Saveフォルダ内にsysconfig.iniというファイル名で書き出すのよ。

※もちろんファイルの保存場所や名前は変えてもOKよ。拡張子はWindowsの設定ファイルに用いられるiniを使ったけど、中身はただのテキストファイルだからtxtとか拡張子なしでも別にいいと思うわ。


セーブの処理はこれだけでOK。ゲーム設定の操作コモンから呼び出して試してみましょうか。
■イベントの挿入[名]: [“●ゲーム設定S/L”] <コモンEv 14> / 0:セーブ


ゲームを起動させて設定を適当に変更してみて頂戴。


するとSeveというフォルダが作成されて、


フォルダ内にsysconfig.iniというファイルが作成されていて、


適当なテキストエディタでファイル内容を見ると、設定したシステム変数の値が書き出されているはずよ。

※これは文章速度が30、音量がBGM、BGS、SEそれぞれ60ということね。

余談 なぜセーブ/ロードコマンドを使わないのか

ちなみになぜセーブ/ロードコマンドでなくテキストファイルへの書き出しを使ったのかというと、こっちの方が色々と都合がいいからよ。

ウディタのセーブ機能は「その時点での諸々を全て保存する」という仕様なの。システムDBも可変DBも、その時に表示しているピクチャも何もかもね。だからとても重くて読み書きにも時間がかかるの。

文章速度はともかく音量はゲーム起動時にすぐ反映させたいけど、起動のたびに毎回時間のかかるロード処理を入れるのはちょっと避けたいわよね?

それだったらゲームのコンフィグ設定だけにセーブコマンドを使わなくても、テキストファイルで読み書きした方が処理がずっと軽くて済むという理屈ね。

それにこの方法なら、仮にセーブデータが複数作られるゲームだったとしても「どのセーブデータから設定を持ってくるか」という事を考えなくても済むわ(勝手に最後に保存した設定が反映されるから)。

ゲーム設定のロード処理を作成する

セーブができたから今度はロード処理を作成しましょう。

やる事は基本的にセーブの逆、sysconfig.iniに書き出した値を読み込んでシステム変数に適用する流れになるわ。


まずはsysconfig.iniの内容をセルフ文字列に読み込む
■文字列操作:CSelf5[設定内容] =<ファイル内容読込> [UTF-8] “Save/sysconfig.ini”

読み込んだ内容をシステム変数に反映させるには一行ずつ切り出す必要があるから、


一行切り出し用のセルフ文字列を追加で用意して、


その中にsysconfig.iniから読み込んだ内容を一行切り出す
■文字列操作:CSelf6[一行切出用] =<上1行切出> CSelf5[設定内容]


これで最上段の値だけがセルフ文字列6番に格納されるわ。

次はこれをそのまま変数操作でシステム変数に代入すればいいのだけど、


「Self」から選択しようとしてもセルフ文字列は表示されないわ。

じゃあどうすればいいのかというと、


変数呼出し値を使えばいいわ。「手動」を選択して1600006と入力すれば、


このように、セルフ文字列6番の内容をシステム変数に格納することができるのよ。
■変数操作: Sys9:メッセージ速度( X 文字/秒) = CSelf6[一行切出用] + 0


音量設定も一行ずつ切り出して設定に反映させましょう。まずはBGMから。
■文字列操作:CSelf6[一行切出用] =<上1行切出> CSelf5[設定内容]
■変数操作: Sys100:BGM音量補正[%] = CSelf6[一行切出用] + 0


BGSとSEの音量設定も同様に切り出して反映させてね。
■文字列操作:CSelf6[一行切出用] =<上1行切出> CSelf5[設定内容]
■変数操作: Sys101:BGS音量補正[%] = CSelf6[一行切出用] + 0
■文字列操作:CSelf6[一行切出用] =<上1行切出> CSelf5[設定内容]
■変数操作: Sys102:SE音量補正[%] = CSelf6[一行切出用] + 0

これでゲーム設定のロード処理は完成。あとはこれをゲーム起動時に呼び出す処理も必要なんだけど……。


呼び出しは最初に作ったシステム初期設定コモンで行いましょう。このコモンの文章速度と音量を初期設定している部分に追記するわ。

といっても、単純にロードでコモン呼び出しすればいいかというとそれは×。ゲームを初めて起動した場合は設定ファイル自体が保存されていないし、設定ファイルを削除してしまっている可能性もあるからね。

だからまず「設定ファイルが存在しているか」を判別する処理を作成しましょう。どうやるかというと


ファイルの有無を格納するセルフ文字列を1つ用意して、


文字列操作で以下のコマンドを実行。
■文字列操作:CSelf5[設定ファイル有無] =<ファイル内容読込> [自動文字コード判別] “<<GET_FILE_EXIST>>Save/sysconfig.ini”


<<GET_FILE_EXIST>>というのは指定したファイルが存在するかを調べられるコマンドなの。これを使うと右辺に指定したファイルが存在すれば1、存在しなければ0が読み込まれるのよ。


これで設定ファイルの有無が分かったから、条件分岐(文字列)を作成してファイルが無い場合とある場合の処理を作っていきましょう。
■条件分岐(文字): 【1】 CSelf5[設定ファイル有無]が “0” と同じ 【2】 CSelf5[設定ファイル有無]が “1” と同じ
-◇分岐: 【1】 [ CSelf5[設定ファイル有無] “0” と同じ ]の場合↓
|■
-◇分岐: 【2】 [ CSelf5[設定ファイル有無] “1” と同じ ]の場合↓
|■
◇分岐終了◇


設定ファイルがない場合の分岐では値の初期設定を行いましょう。先に入力していたコマンドを切り取り移動するのよ。
■変数操作: Sys9:メッセージ速度( X 文字/秒) = 500 + 0
■変数操作: Sys100:BGM音量補正[%]~Sys102:SE音量補正[%] = 50 + 0


そして設定ファイルが存在する場合をその内容をロードする。
■イベントの挿入[名]: [“●ゲーム設定S/L”] <コモンEv 14> / 1:ロード

これでゲーム起動時の設定ファイル読み込み処理もOKよ。

ゲーム起動時に設定が読み込まれるか試してみる

それじゃテストしてみましょう。直前のゲーム設定変更では音量を60、メッセージ速度をおそいに設定していたから、


ゲーム起動時に前回の設定が読み込みされていれば成功。

次に設定ファイルが存在しない場合(ゲーム設定未実行orファイルを削除してしまったケース)も確認するわ。


Saveフォルダ内のsystemconfig.iniファイルを削除してみましょう。その後ゲームを起動すると、


音量が50、メッセージ速度がふつうに初期設定されればOK。

以降はこの設定を変更するたびに内容がセーブされて、ゲーム起動時に自動で読み込まれ反映されるようになっているはずよ。

こんな感じでゲーム設定のセーブとロードについての解説は終了。

今回はゲーム設定(コンフィグ)として活用したけど、このゲーム内容をファイルに書き出すやり方は色々と応用が可能よ。

プレイの周回データとか、図鑑やイベント回想とか、本編のセーブとは別管理で保存したい内容って結構あるわよね? そういう場合(いわゆるシステムデータ)の管理に活用するといいと思うわよ。