リプレイ機能

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
にこよん
記事: 113
登録日時: 7年前
住所: 大阪府
連絡を取る:

リプレイ機能

#1

投稿記事 by にこよん » 6年前

とあるシューティングゲームでリプレイ機能なるものを作ってみたいと思ったのですが、
そのようにして作ればいいのでしょうか?
効率のいい仕組みが知りたいです(DXライブラリを使って実装する場合の)

プレイ時⇒思いついたのは入力されたキーボードを毎ループ保存する(数秒おきにファイルに保存
再生時⇒fileから読み込んだキーボードの値をキーボードから打ち込まれたようにGetKeyから返す

ただ、GetRandを多用しているためプレイヤーが全く同じ動きをしても意味がありません
なのでGetRandのラッパー関数を作成して
int GetRand_Replay(int RandMax) {
static int s = 0;
SRand(s);
GetRand(RandMax);
}のようにすれば多分GetRandが呼ばれる順番も同じになるはずなのでできるかなと思ったのですが
ファイルに書き出し続けることなども含めいろいろ無理があるように感じます

参考になるサイトなどをご教授くださいm(__)m
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: リプレイ機能

#2

投稿記事 by Dixq (管理人) » 6年前

ラッパー関数は不要でしょう。
最初に同じシードでSRandすればいいのです。
関数内にstatic変数を用いてそれを頼りにするのはご法度手法なのでやめましょう。

ゲーム開始時に現在のミリ秒などを取得。それを乱数のシードとし、そのシードをファイルに保存。
それ以降ずっとキーの入力情報を保存し続ける。ファイルに出力

リプレイ時に、ファイルから乱数のシードを取得し、それをセット。
それ以降ずっとキーの入力状態をファイルから取得し続け、その時の入力状態を再現する。

GetRandを多用していようが、その時と同じ状況が作り出せれば正常にリプレイが動作します。
ただし、状況によって呼んだり呼ばれなかったりするような設計には用いられません。
GetRandの呼ばれる回数やタイミングが変わらないことが前提です。

> ファイルに書き出し続けることなども含めいろいろ無理があるように感じます

何が無理なのでしょうか?
ファイルに書き出し続けることは可能ですし、一斉に書き出したいならvectorにでも蓄積して、リプレイを保存するとなった瞬間にファイル出力してもいいです。

ただ、60フレームすべてのキーを保存すると無駄なデータが多くデータ量が大きくなりすぎます。
ですので、生成した後でzip圧縮するか、キーの入力が変わった情報のみを保存するようにすればいいです。

四聖龍神録1のリプレイデータはMB行くこともありましたが、四聖龍神録2のリプレイデータはデータを小さくする工夫がしてあるので1面あたり800バイト程度です。
ただ散々苦労してデータを小さくしたものの、zip圧縮しても割と小さくなるので、下手に苦労するより最初は安直に60フレーム全データを記憶してzip圧縮ってもんでしょうか。

アバター
にこよん
記事: 113
登録日時: 7年前
住所: 大阪府
連絡を取る:

Re: リプレイ機能

#3

投稿記事 by にこよん » 6年前

説明ありがとうございます
知らないのを調べていたのですがそのようにできるのですか
これを参考にもう少しプログラムしてみます
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

返信

“C言語何でも質問掲示板” へ戻る