とあるシューティングゲームでリプレイ機能なるものを作ってみたいと思ったのですが、
そのようにして作ればいいのでしょうか?
効率のいい仕組みが知りたいです(DXライブラリを使って実装する場合の)
プレイ時⇒思いついたのは入力されたキーボードを毎ループ保存する(数秒おきにファイルに保存
再生時⇒fileから読み込んだキーボードの値をキーボードから打ち込まれたようにGetKeyから返す
ただ、GetRandを多用しているためプレイヤーが全く同じ動きをしても意味がありません
なのでGetRandのラッパー関数を作成して
int GetRand_Replay(int RandMax) {
static int s = 0;
SRand(s);
GetRand(RandMax);
}のようにすれば多分GetRandが呼ばれる順番も同じになるはずなのでできるかなと思ったのですが
ファイルに書き出し続けることなども含めいろいろ無理があるように感じます
参考になるサイトなどをご教授くださいm(__)m
リプレイ機能
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: リプレイ機能
ラッパー関数は不要でしょう。
最初に同じシードでSRandすればいいのです。
関数内にstatic変数を用いてそれを頼りにするのはご法度手法なのでやめましょう。
ゲーム開始時に現在のミリ秒などを取得。それを乱数のシードとし、そのシードをファイルに保存。
それ以降ずっとキーの入力情報を保存し続ける。ファイルに出力
リプレイ時に、ファイルから乱数のシードを取得し、それをセット。
それ以降ずっとキーの入力状態をファイルから取得し続け、その時の入力状態を再現する。
GetRandを多用していようが、その時と同じ状況が作り出せれば正常にリプレイが動作します。
ただし、状況によって呼んだり呼ばれなかったりするような設計には用いられません。
GetRandの呼ばれる回数やタイミングが変わらないことが前提です。
> ファイルに書き出し続けることなども含めいろいろ無理があるように感じます
何が無理なのでしょうか?
ファイルに書き出し続けることは可能ですし、一斉に書き出したいならvectorにでも蓄積して、リプレイを保存するとなった瞬間にファイル出力してもいいです。
ただ、60フレームすべてのキーを保存すると無駄なデータが多くデータ量が大きくなりすぎます。
ですので、生成した後でzip圧縮するか、キーの入力が変わった情報のみを保存するようにすればいいです。
四聖龍神録1のリプレイデータはMB行くこともありましたが、四聖龍神録2のリプレイデータはデータを小さくする工夫がしてあるので1面あたり800バイト程度です。
ただ散々苦労してデータを小さくしたものの、zip圧縮しても割と小さくなるので、下手に苦労するより最初は安直に60フレーム全データを記憶してzip圧縮ってもんでしょうか。
最初に同じシードでSRandすればいいのです。
関数内にstatic変数を用いてそれを頼りにするのはご法度手法なのでやめましょう。
ゲーム開始時に現在のミリ秒などを取得。それを乱数のシードとし、そのシードをファイルに保存。
それ以降ずっとキーの入力情報を保存し続ける。ファイルに出力
リプレイ時に、ファイルから乱数のシードを取得し、それをセット。
それ以降ずっとキーの入力状態をファイルから取得し続け、その時の入力状態を再現する。
GetRandを多用していようが、その時と同じ状況が作り出せれば正常にリプレイが動作します。
ただし、状況によって呼んだり呼ばれなかったりするような設計には用いられません。
GetRandの呼ばれる回数やタイミングが変わらないことが前提です。
> ファイルに書き出し続けることなども含めいろいろ無理があるように感じます
何が無理なのでしょうか?
ファイルに書き出し続けることは可能ですし、一斉に書き出したいならvectorにでも蓄積して、リプレイを保存するとなった瞬間にファイル出力してもいいです。
ただ、60フレームすべてのキーを保存すると無駄なデータが多くデータ量が大きくなりすぎます。
ですので、生成した後でzip圧縮するか、キーの入力が変わった情報のみを保存するようにすればいいです。
四聖龍神録1のリプレイデータはMB行くこともありましたが、四聖龍神録2のリプレイデータはデータを小さくする工夫がしてあるので1面あたり800バイト程度です。
ただ散々苦労してデータを小さくしたものの、zip圧縮しても割と小さくなるので、下手に苦労するより最初は安直に60フレーム全データを記憶してzip圧縮ってもんでしょうか。
Re: リプレイ機能
説明ありがとうございます
知らないのを調べていたのですがそのようにできるのですか
これを参考にもう少しプログラムしてみます
知らないのを調べていたのですがそのようにできるのですか
これを参考にもう少しプログラムしてみます