2016年3月6日日曜日

ウディタでADV(ノベルゲー)作成講座10 既読スキップ

システム文字列の26番は文章表示の先頭に文字列を追加する変数、27番は文章表示の最後尾に文字列を追加する変数になっています。
また、文章表示で「\>」と入力すると、続く文章を瞬間表示し、「¥^」でキー入力を待たずに文章表示を終えることができます。
既読文章の時にはこれらのコマンドを挿入するようにすれば、既読スキップは簡単に導入可能です。

ただ、既読文章かどうかの判別をするのが、かなり面倒くさいです。

一本道のノベルゲームなら簡単なんですが、分岐とかあると大変ややこしいです。
とりあえず私の思いつく方法としては二つあります。

文字列変数を使ってみる

まず、一つの方法がこれです。ややこしさは低め。
たくさん分岐があっても大丈夫。
まず、表示した文章をどんどん一つの文字列変数に追加していきます。
そして、表示する文章がスキップ対象に含まれるかいちいち判断するというシンプルな方法です。
長いシナリオになると、処理に時間がかかりそうなのが欠点です。
あとは、以前に表示した文章と同じ文章は既読と判断されてしまうため、使うことができません。
無口キャラが「………」と言ったり、口癖のあるキャラクターを出すのが難しくなるかもしれません。


まず、空いている文字列変数3番に「既読スキップ判定用」と名前を付けました。

そして、「コモンイベント001:文章表示」の、「コモン001:文章表示」の、実際に文章を表示する直前辺りに「条件(文字列)」で「1600005(※コモンセルフ5番に表示する文章が格納されています)」を含むかどうかの分岐を作ります。
「上記以外の場合」を作成。

「含む」場合は、既読スキップONの場合には既読スキップの処理をします。

空いている変数5番に「1=既読スキップON」と名前をつけました。

「変数5」が「1と同じとき」で条件を作り、既読スキップの設定がONになっているかどうかの判定をいれます。

ONになっている場合はシステム変数の操作をします。

システム変数26番に「¥>」を代入します。
システム変数27番に「¥^」を代入します。

さて、次に「文字列変数3:既読スキップ判定用」に対象の文章が含まれない場合です。

「文字列操作」で「文字列変数3:既読スキップ判定用」に「コモンセルフ5:表示する文章」を追加します。


まとめるとこんな感じです。
文章を表示した後にシステム変数を直しておくのを忘れずに。

次に、セーブの処理です。
全セーブデータで共有するデータにしたいので、絶対使わないセーブ番号をシステムセーブとして使います。今回は13番にしました。


「セーブ・ロード操作」の「セーブデータへの書き込み」にデータに13番を指定。
「3000003」(文字列変数3番)に文字列変数3番を書き込むように指定しました。
書き込み先の変数は文字列変数であればどれでもいいんですが、同じにしておいた方が混乱が少ないと思います。


次にロードした時の処理です。

「コモンイベント8:基本ルーチン」に、ロード処理を入れます。
「文字列変数3:既読スキップ判定用」に、データ番号13番の「3000003(文字列変数3番)」をロードするよう入力しました。

以上です。わりと単純な作りになっていると思います。

シナリオごとに変数を準備する

シナリオごとに変数を作って、そのシナリオごとに、どれだけ読んだか記録していく感じです。
データベースを使ってもいいと思います。
とりあえず、予備変数1の0~3番にシナリオごとの「最大進行度」という名前をつけました。



また、変数7番に「シナリオ進行度セーブ用」という名前を付けました。

「コモンイベント008:基本ルーチン」で、その変数7番に、「2100000」を入力します。このとき、「データを呼ばない」を忘れずにチェックします。
※2100000は予備変数1の0番を呼び出す呪文ですが、「データを呼ばない」にチェックを入れているので、その変数に格納されている数値ではなく、2100000という数値として扱われます。

シナリオ番号に応じて、対応する予備変数番号を入力していきます。

シナリオ番号0の時は「2100000」
シナリオ番号1の時は「2100001」
シナリオ番号2の時は「2100002」……という感じに、すべてデータを呼ばないにチェックを入れて、数値を代入していきます。

各シナリオを読み切ったら、システムデータに既読したことが記録されるように処理します。

各シナリオの最後、シナリオ進行度をリセットする直前あたりで「セーブ・ロード操作」をします。
セーブデータへの書き込みにデータ番号13番(使っていないセーブデータ番号)を指定し、「x番の変数読込」にチェックをいれて、「2000007」を指定します。
そこに、「変数2番:シナリオ進行度」が格納されるようにします。

次に、シナリオ途中でセーブする場合について考えてみます。
基本的には上記のと同じ操作を入力すればいいのですが、複数のセーブデータを扱う場合に問題が生じます。
例えば、一度すべてのシナリオを読み切って、二回目にプレイする時、途中でセーブしてシステムデータに上書きしてしまうと、一度読んだはずのシナリオが途中までしか読んでいないことになってしまいます。
そのため、セーブの処理をする際、いちいち既存のデータを読み込んで、もし進行度がそれよりも進んでいるならセーブする、という分岐を作る必要があります。

まず、「コモンイベント006:セーブ画面」のコモンセルフ変数15番に「シナリオ進行度読み込み」と名前をつけました。

セーブ画面で決定キーを押した際の処理のところで、今名前をつけたコモンセルフ変数15番にデータを読み込みます。
「x番の変数読込」にチェックをいれて、データ13番の「2000007」を読み込みます。


「条件(変数)」で「変数2:シナリオ進行度」が「コモンセルフ15:シナリオ進行度読み込み」より大きいときに条件を設定します。

この条件を満たすときにのみ、セーブデータへの書き込みを実行します。


こんな感じになりました。

次に文章表示の処理です。

「コモンイベント001:文章表示」の実際に文章を表示する処理の直前辺りに、分岐をつくります。

「変数5:1=既読スキップON」が「1と同じ」とき、と条件を設定します。

コモンセルフ変数10番に「既読判定用」と名前をつけました。
その変数にデータをロードします。

「コモンセルフ変数10」にデータ番号13番の「2000007」を読み込みます。「x番の変数読込」をチェックしておきます。


「条件(変数)」で「コモンセルフ10:既読判定用」が「変数2:シナリオ進行度」「より大きい」のときに条件を設定します。


条件を満たす場合に、システム変数26番に「¥>」を代入します。
また、システム変数27番に「¥^」を代入します。

文章表示が終わった後に、システム変数26番と27番をクリアにしておきます。


既読スキップのONとOFF


既読スキップをするかどうかは「P」ボタンを押したときにON/OFFが切り替わる処理をしました。



0 件のコメント:

コメントを投稿