
市販ゲームなどにリプレイ機能が付いているのをよく見るのですが、
あれの実現方法について考えてみました。
リッジレーサーやグランツーリスモ、東方などのリプレイ機能のアルゴリズムは
敵や車の動きからランダム性を完全に排除することでユーザーのキーの入力のみ
をリアルタイムにセーブしてリプレイ時に同じ動きを同じ条件で毎回再現
しているのではと思ったのですが、仮にランダム性のあるゲームだと
リプレイ機能は動画のキャプチャでもしない限り実現は難しいのでしょうか?
ふと市販のゲームのリプレイを観ていて考えたのですが
何を言っているのか良く分からなかったらすみません。。
No.5ベストアンサー
- 回答日時:
4です。
3000個は300個、180000個は18000個の間違いです。
大変分かりやすかったです。
実際の3Dレースゲームなどはこれに加速度や初速度(その時点でのkm速さ)が
加わるのでしょうが大体そんな感じかもしれませんね。
ちょっと考えてみたのですがそのやり方だとリプレイ時の再現における初期の僅かなズレが後々散大していくと思われるので少し改良して、
ハンドルの角度、アクセルボタンを押しているか押していないかを
たとえば1秒の内59/60はこの方式で記録し、1/60ごとに
加速度、初速度、3D座標を記録してリプレイ時にフレームのズレを定期的に
修正するような形でやると情報量を抑えた完璧な再現が出来そうですね。
ありがとうございました!
No.4
- 回答日時:
簡単な考え方をひとつ紹介します。
(1)アクセル、ブレーキ、ハンドルの3つの現在位置情報を数値化します。
○条件
・分解能を100(00~99)とします。
・アクセルとブレーキは離した状態が00、目一杯踏んだ状態が99とします。
・ハンドルは中立位置を49、左一杯に切った状態を00とします。
○設定
現在位置を数値化し記録します。
・アクセル:33(3分の1くらい踏んでる)
・ブレーキ:00(離してる)
・ハンドル:52(ちょっと右に切ってる)
(2)上記データを1秒間に100回記録します。
要は運転を記録して、全く同じ運転をさせるということです。
上記例では1秒間で2桁の数字を3000個、1分間で180000個しか記録しないので、大した情報量になりません。
敵の車の運転状態も同様記録できるでしょう。
3様の回答にあるように乱数記録の方法もあります。
リッジレーサーやグランツーリスモなどがどういった記録方式を取っているのかわかりませんが、私が作るとしたらこんな感じです。
No.3
- 回答日時:
> 仮にランダム性のあるゲームだと
> リプレイ機能は動画のキャプチャでもしない限り実現は難しいのでしょうか?
コンピュータ上で使用される疑似乱数では
最初に与える乱数の種によってその後得られる乱数列が決まります。
コンピュータゲームでのランダム性は疑似乱数を用いて
実現しているわけですから、
乱数の種を保存してリプレイ時に使用すれば
同じ乱数列を得て同じ状況を再現することができます。
そういえばこれは乱数のアルゴリズムによるのかもしれませんが、
SFCのドラクエ5のカジノのポーカーやエンカウントなどは乱数が
時間から得られているのでエミュレーターで直前のセーブデータを
クイックセーブしておけば何度ロードしなおしても同じ結果にしかならない
とかありましたね。そういう性質を利用したらリプレイに使えるかもしれないですね。。
乱数をドミノのように最初に設定した値からプログラム実行中は全て派生できる
ようなアルゴリズムで無いと出来ないのでやや限定的かもしれませが・・・。
No.1
- 回答日時:
ゲームの動きをコマンド化し、コマンドのログを取る
という考えがすっきりします。
例えば、敵の車の動きがランダムなのであれば、ラン
ダムな数値を得た後に、
(動作 敵の車、現在位置、次ランダムで得た数値)
といったようなコマンドを作り、そのコマンドを受け
たらゲームが進むように作るわけですね。
回答ありがとうございます。
その方法も考えてみたのですが、そのやり方で1フレームごとに座標を
保存するとしたら3Dのレースゲームとかだと情報量も多いため
膨大なテキスト量になってしまわないでしょうか・・?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトが実行中か...
-
ttlで戻り値を取得する方法
-
コマンドプロンプトで表示が多...
-
Pythonのターミナルをクリアし...
-
コマンドプロンプトですべてのU...
-
デバッグ環境の開発について。G...
-
"伴われる"は正しい日本語ですか?
-
Ciscoポートミラーリングの設定...
-
HTAで n秒間 Sleepする方法は?
-
【Teratermマクロ】文字列の一...
-
VBA でshell関数を使ってコマン...
-
DOSコマンドでポートから受信
-
jupyter notebookが開けません!
-
WaitForSingleObjectについて
-
ローマ字入力で「トゥ」を入力...
-
word の文字入力 文字が青色に...
-
「未使用」と「不使用」ってど...
-
ACCESS VBA でのエラー解決の根...
-
Excelでエラー(#N/Aなど)値を...
-
1点の辻の字に変換したいがエク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトが実行中か...
-
コマンドプロンプトで表示が多...
-
ttlで戻り値を取得する方法
-
別のユーザーフォームのコマン...
-
バッチファイルでキー操作を行う。
-
Tera Term Proに関する質問です。
-
【Teratermマクロ】文字列の一...
-
VBA でshell関数を使ってコマン...
-
VBユーザーフォームで時間入力
-
文字の点滅はどうやるのですか?
-
"伴われる"は正しい日本語ですか?
-
VB6で、コマンドボタン自身の色...
-
PowerShell実行結果をデスクト...
-
コンボボックス(最終行取得)
-
EEPROMのデータの初期化について
-
入力待ち状態になるexeファイル...
-
JP1起動バッチについて
-
コマンドプロンプトですべてのU...
-
ImageMagickを使って画像の特定...
-
ACCESSのサブフォームの...
おすすめ情報