「次の選択肢までスキップ」の仕組み(ノベルゲーム)
Posted: 2014年8月20日(水) 09:17
はじめまして。ぺりおと申します。
現在DXライブラリを使用してノベルゲームを作成しているのですが、
シナリオを「次の選択肢までスキップ」させる機能の良い仕組みが思いつかないため、
相談いたします。
ゲーム自体は一般的なノベルゲームで、クリックでシナリオを読み進め、
選択肢によってキャラクターの好感度を上げ、これによりシナリオが分岐します。
シナリオは、ゲーム本体とは別にシナリオを記述したファイル(以下シナリオファイル)があり、
シナリオファイルには画面に表示するメッセージ・セリフや、
画像や音声のロード、表示、解放などの命令を記述します。
(シナリオファイルは、予めメモリにロードしておくので、
一行ごとにファイルから読み込むようなことはしません。)
また、どのシナリオファイルの何行目は、過去に実行したことがあるかどうか、
という情報をセーブデータとして持っています。
(これを利用して、Ctrlキー押下時には既読行をノーウェイトで
処理させる機能を既に実装しています。いわゆるCtrlスキップ機能です。)
ここで新たに、ゲーム中に特定のボタンを押すと、「次の選択肢までスキップ」させる
機能を作成したいと思っています。
仕様は以下の通りにします。
・現在のシナリオ位置から、次に出現する選択肢の箇所までシナリオ位置を移動させる
・スキップ可能なのは既読行のみ。もしスキップ途中で未読行が出現したら
選択肢に到達しなくても未読箇所でスキップを停止する
これを実現するために「次の選択肢までスキップ」を実装しましたが、
どうしても速度が出ず困っています。
次のように実装しました。
「次の選択肢までスキップ」中は、通常と同じように一行ずつシナリオを処理する。
(好感度によるシナリオ分岐なども通常通り行います)
スキップ中は、高速化のため画像や音声のロード、表示や再生は行わない。
ただしシナリオに従い、ロードすべきファイル名や、表示中/再生中の状態を記録しておく。
(途中に画像・音声の開放命令があれば、ロード状態を取り消します)
スキップが完了したら、記録した画像・音声のファイル名をもとに、これらをまとめてロードする。
同様にして、記録した表示中・再生中の情報に従い、表示や再生を行い、スキップ処理が終了します。
ところがこの方法では、シナリオ中のロードや描画処理などを省略しているとはいえ、
(最後に整理してまとめて行っていますが)
どうしてもスキップ対象の行数だけ、シナリオを処理する必要がでてきます。
スペックにもよりますが、仮に1万行シナリオを進めるとしたら、
かなりの処理時間が発生してしまいます。
(ロード画面を出してプレイヤーを待たせることもできますが、
どちらにしても待ち時間は誤魔化せません)
選択肢ごとにセーブデータを作っておき、これをロードさせる方法も考えましたが、
選択肢の出現回数が多いと現実的ではありません。
(好感度によってシナリオを分岐させる都合上、同じシナリオ位置にいても、
いつでも次の選択肢が同じとは限りませんし、未読箇所で停止する仕組みに対応できません)
「次の選択肢までスキップ」機能を高速化したいと思っていますが、
どのように実装するのが良いでしょうか。
皆様の知恵をお貸しいただければと思います。
よろしくお願いします。
現在DXライブラリを使用してノベルゲームを作成しているのですが、
シナリオを「次の選択肢までスキップ」させる機能の良い仕組みが思いつかないため、
相談いたします。
ゲーム自体は一般的なノベルゲームで、クリックでシナリオを読み進め、
選択肢によってキャラクターの好感度を上げ、これによりシナリオが分岐します。
シナリオは、ゲーム本体とは別にシナリオを記述したファイル(以下シナリオファイル)があり、
シナリオファイルには画面に表示するメッセージ・セリフや、
画像や音声のロード、表示、解放などの命令を記述します。
(シナリオファイルは、予めメモリにロードしておくので、
一行ごとにファイルから読み込むようなことはしません。)
また、どのシナリオファイルの何行目は、過去に実行したことがあるかどうか、
という情報をセーブデータとして持っています。
(これを利用して、Ctrlキー押下時には既読行をノーウェイトで
処理させる機能を既に実装しています。いわゆるCtrlスキップ機能です。)
ここで新たに、ゲーム中に特定のボタンを押すと、「次の選択肢までスキップ」させる
機能を作成したいと思っています。
仕様は以下の通りにします。
・現在のシナリオ位置から、次に出現する選択肢の箇所までシナリオ位置を移動させる
・スキップ可能なのは既読行のみ。もしスキップ途中で未読行が出現したら
選択肢に到達しなくても未読箇所でスキップを停止する
これを実現するために「次の選択肢までスキップ」を実装しましたが、
どうしても速度が出ず困っています。
次のように実装しました。
「次の選択肢までスキップ」中は、通常と同じように一行ずつシナリオを処理する。
(好感度によるシナリオ分岐なども通常通り行います)
スキップ中は、高速化のため画像や音声のロード、表示や再生は行わない。
ただしシナリオに従い、ロードすべきファイル名や、表示中/再生中の状態を記録しておく。
(途中に画像・音声の開放命令があれば、ロード状態を取り消します)
スキップが完了したら、記録した画像・音声のファイル名をもとに、これらをまとめてロードする。
同様にして、記録した表示中・再生中の情報に従い、表示や再生を行い、スキップ処理が終了します。
ところがこの方法では、シナリオ中のロードや描画処理などを省略しているとはいえ、
(最後に整理してまとめて行っていますが)
どうしてもスキップ対象の行数だけ、シナリオを処理する必要がでてきます。
スペックにもよりますが、仮に1万行シナリオを進めるとしたら、
かなりの処理時間が発生してしまいます。
(ロード画面を出してプレイヤーを待たせることもできますが、
どちらにしても待ち時間は誤魔化せません)
選択肢ごとにセーブデータを作っておき、これをロードさせる方法も考えましたが、
選択肢の出現回数が多いと現実的ではありません。
(好感度によってシナリオを分岐させる都合上、同じシナリオ位置にいても、
いつでも次の選択肢が同じとは限りませんし、未読箇所で停止する仕組みに対応できません)
「次の選択肢までスキップ」機能を高速化したいと思っていますが、
どのように実装するのが良いでしょうか。
皆様の知恵をお貸しいただければと思います。
よろしくお願いします。