2016年2月26日金曜日

ウディタでADV(ノベルゲー)作成講座8 セーブとロード(前編)

さて、セーブとロードを作っていきましょう。
結構ややこしい処理が必要になってくるので注意してください。

セーブ画面を作る


まずは、セーブ画面を作りましょう。

コモンイベントの空いているところに「セーブ画面」と名前をつけます。

コモンセルフ変数をたくさん使うので、先に名前をつけておこうと思います。
画像の黄色い所をクリック。


5番に「表示する文字」
10番に「キー入力受付」
11番に「ピクチャ番号」
12番に「y座標」
13番に「セーブデータ番号」
と、名前をつけました。

では、実際にコマンドを入力していきましょう。


ちなみに、出来上がりイメージはこんな感じにしたいと思います。

まず背景は、いつもと同様、ピクチャで<SQUARE>描画をして作ります。

ピクチャ番号は100000(10万)を指定して「表示」を選びます。
表示タイプは「[4]お手軽ウィンドウ」でファイルに<SQUARE>と入力。
生成サイズは画面いっぱいの横640、縦480です。
カラーはR80、G40、B40にしました。

次にセーブデータを表示するための基盤?ですが、ひとつひとつピクチャ番号を指定して描画していってもいいのですが、同じ動作を繰り返すことになる時はループを使うと便利です。

まずループに入る前に、変数の操作をします。

「コモンセルフ11:ピクチャ番号」に100001(10万とんで1)を代入します

「コモンセルフ12:y座標」には30を代入しました。(画像省略)


「イベント制御」で「回数付きループ」を選び、11回ループするように指定します。

今回は11か所セーブを作りたいので、11回ループさせます(半端な数ですみません)

次に、ループ内の処理です。
基盤となるボックスをピクチャ表示します。

ピクチャ番号に「1600011」を指定し、「コモンセルフ11番:ピクチャ番号」の数値を参照させるようにします。
表示タイプ[4]でファイルに<SQUARE>と入力するのは先ほどと同じです。
生成サイズは横600、縦30にしました。
座標はxに20を指定、yは「1600012」といれ、「コモンセルフ12番:y座標」の数値を参照させるようにします。
カラーはR40、G10、B10を指定し、背景よりも濃い赤色で表示されるようにしました。

ピクチャを表示し終えたらピクチャ番号とy座標に加算をします。

「このコモンセルフ11:ピクチャ番号」に1を加算します。

また、「このコモンセルフ12:y座標」には40を加算します。(画像省略)

以上で基盤を表示させる処理は終了です。

次に、基盤の上に文字を表示させていきましょう。
これも変数の処理をしてから、同じようにループ処理を使います。


「このコモンセルフ12:y座標」に35を代入します。
「このコモンセルフ13:セーブデータ番号」に1を代入します。
「イベント制御」で回数付きループ11回を指定します。










続いて、ループ内の処理です。

文字列変数2番にあらかじめ「セーブ用」と名前をつけておきます。
「セーブ・ロード操作」で各セーブデータの文字列変数2番に何が格納されているかを読み取っていきます。

「変数・文字列の読み込み」を選んで、「このコモンセルフ5」にデータ番号「1600013番」の「3000002」が代入されるように設定します。
※1600013は「コモンセルフ変数13番:セーブ番号」の数値を参照します。
※3000002は文字列変数2番の内容を参照します。



さて、次に文字列(条件)で「コモンセルフ5:表示する文字」に何も代入されていない時という分岐を作ります。

何も代入されていない=セーブデータがないということなので、データがない時は「NO DATA」という文字が表示されるようにします。


「文字列操作」で「コモンセルフ5:表示する文字」を選び、代入する文字列に「セーブデータ¥cself[13]:NO DATA」と打ち込みます。

「ピクチャ表示」で文字列を表示します。

ピクチャ番号は1600011(コモンセルフ11番:ピクチャ番号)です。
表示タイプは「[3]文字列をピクチャとして描画」を選び、表示する文字列に「¥cself[5]」と入力します。
座標はxが25、yが1600012(コモンセルフ12番:y座標)です。
カラーはRGBすべて100にしておきます。



「コモンセルフ12:y座標」に40加算します。
「コモンセルフ11:ピクチャ番号」に1加算します。
「コモンセルフ13:セーブデータ番号」に1加算します。

これでループ内の処理は完了です。

続いて、カーソルを動かすための処理です。


「コモンセルフ11:ピクチャ番号」に100001を代入します。
「コモンセルフ13:セーブデータ番号」に1を代入します。
ループ(繰り返し)のコマンドを入力して、ウェイト1フレームを挿入します。

選択している位置のセーブデータを明るく表示します。

「エフェクト」でピクチャ番号1600011(コモンセルフ11:ピクチャ番号)を選択し、カラー補正をかけます。
赤緑青すべて50に設定します。


「キー入力」で「コモンセルフ10:キー入力受付」を指定し、上下キー、決定キー、キャンセルキーを受け付けるように設定します。


「コモンセルフ10:キー入力受付」が「2と同じ」場合の分岐を作ります。

下キーを押した時の処理を分岐の中に作っていきます。

まず、ウェイトを10フレーム挿入します。(画像省略)

カーソルを移動させる前に、今、明るく表示しているピクチャを元の色に戻しておきます。

「エフェクト」でピクチャ番号に「1600011(コモンセルフ11:ピクチャ番号)」を指定し、カラー補正を選んで、赤緑青ともに0を入力します。


「コモンセルフ11:ピクチャ番号」に1加算します。
「コモンセルフ13:セーブデータ番号」に1加算します。

一番下までカーソルを移動させた時に、一番上に戻る処理をします。

条件(変数)で「コモンセルフ13:セーブデータ番号」が「12以上」のときを条件に分岐を作ります。
「コモンセルフ13:セーブデータ番号」に1を代入します。
「コモンセルフ11:ピクチャ番号」に100001を代入します。

ここまでで、下キーを押した場合の処理は完了です。
続いて上キーを押したときの処理ですが、下キーを押したときとほぼ同じなので、コピー&ペーストして、数値を変更すると楽です。



①条件を「コモンセルフ10:キー入力受付」が「8と同じ」ときに設定します。
②「コモンセルフ13:セーブデータ番号」を1減算します。
③「コモンセルフ11:ピクチャ番号」を1減算します。
④条件を「コモンセルフ13:セーブデータ番号」が「0以下」のときに設定します。
⑤「コモンセルフ13:セーブデータ番号」に11を代入します。
⑥「コモンセルフ11:ピクチャ番号」に100011を代入します。

次に、決定キーを押したときの処理です。

まず、条件(変数)で「コモンセルフ10:キー入力受付」が「10と同じ」ときに設定します。
10フレームウェイトを挿入します。


「文字列変数2番:セーブ用」にセーブ番号とプレイ時の日にち・時刻を代入するようにします。
「セーブデータ¥cself[13]: ¥sys[78]月¥sys[79]日 ¥sys[80]時¥sys[81]分」と入力しました。

「セーブ・ロード操作」でセーブをします。

「セーブ」をクリックして、対象セーブデータには「1600013」と設定します。
これで「コモンセルフ13:セーブデータ番号」の数値が対象セーブデータとして参照されます。


最後に「イベント制御」でループ中断を入力します。


続いて、キャンセルキーを押したときの処理です。

条件を「コモンセルフ10:キー入力受付」が「11と同じ」ときに設定します。
ウェイト10フレームを挿入して、ループを中断させます。

ループのあと、イベントの最後に今表示しているピクチャを消去します。

ピクチャ番号10万~10万100まで消去する設定にしました。


ロード画面をつくる


ロード画面もセーブ画面とほぼ同じなので、イベント丸ごとコピーすると楽です。

「コモンイベント6番:セーブ画面」を空いているコモンイベント7番にコピーし、名前を「ロード画面」に変更しました。

決定キーを押したときの処理を修正します。

決定キーを押したとき、セーブではなくロードが行われるように処理を変更しました。

セーブ画面・ロード画面を呼び出すための処理を作っていきます。
Sを押したときにセーブ画面、Lを押したときにロード画面が呼び出されるようにしたいと思います。
「コモンイベント005:並列実行」に、以下のように入力していきます。

「コモンセルフ10:キー入力受付」でキー種を「キーボード全キー」にして、「特定キーのみ判定」にチェックを入れ、キーコードに131と入力します。
これでSキーの入力受付準備ができました。


条件(変数)で「コモンセルフ10:キー入力受付」が「131と同じ」ときを設定します。
「コモンイベント」の「イベントの挿入」で「コモンイベント6:セーブ画面」を指定します。

ロード画面の呼び出しも同様の手順です。

「キー入力」でキーコードを138にして、入力を受け付けます。
条件も同じく「コモンセルフ10:キー入力受付」が「138と同じ」ときに設定し、「コモンイベント」の「イベント挿入」で「コモンイベント7:ロード画面」が呼び出されるように設定します。


さて、以上でセーブとロードの設定は終わりなのですが、テストプレイしてみるとわかりますが、これだけでは色々不具合があります。

まず、ウディタの仕様として、セーブ時には表示しているピクチャや変数の値などをすべて保存し、ロード時にはそれが再現されます。
どういうことかというと、つまり、セーブ画面でセーブすると、ロードした時もセーブ画面から始まりますし、メッセージウィンドウを描画した状態でセーブすると、メッセージウィンドウが出たままの画面から始まります。(表示されている文章などは消えます)
そのため、ロードした時に不要な画面はいちいち消しておかなければいけません。

もう一つ大きな問題が。
ウディタのセーブ機能では、実行中のイベントがどこまで進んだかは保存されません。
つまり、自動実行にしていても、ロードすると常に指定したイベントの初めからになってしまうのです。
これを解決するためには、イベントが完了時にしかセーブできないようにすると簡単です。
シナリオをいくつかにわけ、章の終わりごとにしかセーブできないようにするとか。
移動先を選ぶモードのあるADVなら、そこでしかセーブできないようにするとか。

そうは言ってもノベルゲーなら文章表示中や選択肢表示中にいつでもセーブできるようにしたいのが人情(?)というものでしょう。
次回はイベントの途中でもセーブとロードをできるようにする方法について書いていきたいと思います。


それから、バックログの時と同じ問題ですが、セーブ画面を呼び出している間もキー入力をすると、ゲーム本編にも影響が出てきます。
セーブ画面を呼び出している間、選択肢のキー入力を受け付けないように設定しておく必要があります。


セーブ画面の一番最初に、「変数1:選択肢のキー入力を受け付ける」に1を代入しておきます。




セーブ画面を復帰する前に、「変数1:選択肢のキー入力を受け付ける」の数値を0に戻しておきます。

ちなみにこのままだと選択できない状態でセーブされてしまうので、ロードした時に再び選択肢のキー入力を受け付けるよう変数を操作してやる必要があります。

また、文章表示中にセーブ画面を呼び出したとき、セーブするために決定キーを押すと文章送りされてしまいます。そうすると、セーブ画面呼び出し前とセーブ画面から復帰した時に表示される文章が異なることになるので、これを防ぐ処理を追加しましょう。

まず、変数4番に「文章を送らない」という名前をつけました。


「コモンイベント1:文章表示」で文章を表示した直後に、「変数4:文章を送らない」が「1と同じ」ときという条件を作り、この変数が0になるまでイベントを進めないようにループ処理します。


ループ後、再び文章を表示させます。
決定キーを押したときに文章を送らせないようにするのは不可能なので、セーブ画面を抜けた時に同じ文章を表示することで対処しています。



「コモンイベント6:セーブ画面」の最初に、「変数4:文章を送らない」に1を代入しセーブ画面から復帰する前に「変数4:文章を送らない」に0を代入するようにします。

このままだと、同じ文章が二回表示されてしまうことがあるので、セーブ画面を表示したときに、現在表示している文章は強制的に終了させておきます。


「文字列操作」で「システム変数27:文章表示追加 最後尾」に「\^」を代入して、文章表示を終了させます。
そのままにしておくと、今後の文章すべてが自動で飛ばされてしまうので、すぐに「システム変数27:文章表示追加 最後尾」を操作しておきます。

「コモンイベント7:ロード画面」も同様に選択肢のキー入力受付と文章送りについて設定します。

0 件のコメント:

コメントを投稿