リプレイデータの記録について
Posted: 2010年8月22日(日) 08:58
お世話になります。
現在リプレイデータの記録&再生を頑張って実装しようとしているのですが、
どうしても途中でずれてしまいます。(もしかしたら初めからずれているのかもしれません)
そこで、昔リプレイの保存で議論していたスレがあったので、ちょっと目を通してみました。
下記のスレです。
http://www.play21.jp/board/formz.cgi?ac ... &rln=54489
ここで、キューさんがサンプルとして書いていただいているコードと私が自分で書いてるコードは
大体やってることは同じだったのですが、一つだけ違いがありました。
それは、キューさんの方のコードは最初にキーの状態を全て保存しておいて、リプレイ再生時にまずそれを
読み込んで当時の最初のキー状態を再現しているところです。
私はこれは必要ないと思ったのでやっていません。
理由としては、
まず0フレーム目の記録の際に、現在のキー状態と過去のキー状態を比べて差異があれば、
ファイルに書き込みを行っています。
この処理を行っていれば、最初のキー状態を再現できると思ったからです。
例えば0フレーム目にAキーが押されていたとします。
この時点では、過去キー用変数には0フレーム目なので何も値は入っていません。
なので最初の差異をチェックする部分で必ず、ファイルに書き込みが行われます。
これを後から再生すると、0フレーム目でAキーという情報が読み込まれ、
Aキーが押されたいたことになります。
ですので、最初にキー状態を全て保存しておく必要はないと思っています。
私とキューさんのコードの違いはこの部分だけです。
この違いが原因で私のリプレイ再生がずれていることに関係しているのかわかりませんが、
この最初にキーを全て保存しておくことが本当に必要なのかどうかをはっきりさせたいので、
必要であれば必要な理由をお答え願えないでしょうか?
それと、もう一つありまして、
このスレで議論されている差分フレームの話は非常に興味がありまして、どうせならこの理論を
取り入れたいと思っています。
しかし、まだC言語暦が3ヵ月半程度で経験不足な為、完全に理解することができませんでした。
特に理解できなかったのが、対象のキーのビットを立てる?ことです。
ビットとバイトの関係は理解しているつもりなのですが、次のキューさんの発言がいまいち分かりません。
========================================================================================
いえ、キーの入力状態を保存する必要はなく、「何番のキーか」を保存すればいいと思います。
上に書いたとおりですが例えば
No. ボタン
0 … 下キー
1 … 上キー
2 … 左キー
3 … 右キー
4 … ショットキー
5 … ボムキー
6 … 低速移動キー
7 … ストップキー
8 … ボス会話スキップキー
みたいに予め決めておきます。
そうすれば、16種類もキーがあれば十分でしょうから、2^4=16で4ビットあればいい事になります。
=========================================================================================
この記述を踏まえて改めて質問致しますと、
もし0~3番までの4ビットを使った場合、右キーを押した場合は変数にどのように
値を入れればいいのでしょうか?
unsigned short test=3
でいいのでしょうか?
もし良かった場合、11~14番の4ビットを使った場合はどうなるのでしょうか?
左に8ビットシフトするので、3×2^8をすればいいのでしょうか?
これが理解できれば、他の部分も全て理解できると思います。
以上、長文になってしまいましたが、分かる方ご教授願います。
現在リプレイデータの記録&再生を頑張って実装しようとしているのですが、
どうしても途中でずれてしまいます。(もしかしたら初めからずれているのかもしれません)
そこで、昔リプレイの保存で議論していたスレがあったので、ちょっと目を通してみました。
下記のスレです。
http://www.play21.jp/board/formz.cgi?ac ... &rln=54489
ここで、キューさんがサンプルとして書いていただいているコードと私が自分で書いてるコードは
大体やってることは同じだったのですが、一つだけ違いがありました。
それは、キューさんの方のコードは最初にキーの状態を全て保存しておいて、リプレイ再生時にまずそれを
読み込んで当時の最初のキー状態を再現しているところです。
私はこれは必要ないと思ったのでやっていません。
理由としては、
まず0フレーム目の記録の際に、現在のキー状態と過去のキー状態を比べて差異があれば、
ファイルに書き込みを行っています。
この処理を行っていれば、最初のキー状態を再現できると思ったからです。
例えば0フレーム目にAキーが押されていたとします。
この時点では、過去キー用変数には0フレーム目なので何も値は入っていません。
なので最初の差異をチェックする部分で必ず、ファイルに書き込みが行われます。
これを後から再生すると、0フレーム目でAキーという情報が読み込まれ、
Aキーが押されたいたことになります。
ですので、最初にキー状態を全て保存しておく必要はないと思っています。
私とキューさんのコードの違いはこの部分だけです。
この違いが原因で私のリプレイ再生がずれていることに関係しているのかわかりませんが、
この最初にキーを全て保存しておくことが本当に必要なのかどうかをはっきりさせたいので、
必要であれば必要な理由をお答え願えないでしょうか?
それと、もう一つありまして、
このスレで議論されている差分フレームの話は非常に興味がありまして、どうせならこの理論を
取り入れたいと思っています。
しかし、まだC言語暦が3ヵ月半程度で経験不足な為、完全に理解することができませんでした。
特に理解できなかったのが、対象のキーのビットを立てる?ことです。
ビットとバイトの関係は理解しているつもりなのですが、次のキューさんの発言がいまいち分かりません。
========================================================================================
いえ、キーの入力状態を保存する必要はなく、「何番のキーか」を保存すればいいと思います。
上に書いたとおりですが例えば
No. ボタン
0 … 下キー
1 … 上キー
2 … 左キー
3 … 右キー
4 … ショットキー
5 … ボムキー
6 … 低速移動キー
7 … ストップキー
8 … ボス会話スキップキー
みたいに予め決めておきます。
そうすれば、16種類もキーがあれば十分でしょうから、2^4=16で4ビットあればいい事になります。
=========================================================================================
この記述を踏まえて改めて質問致しますと、
もし0~3番までの4ビットを使った場合、右キーを押した場合は変数にどのように
値を入れればいいのでしょうか?
unsigned short test=3
でいいのでしょうか?
もし良かった場合、11~14番の4ビットを使った場合はどうなるのでしょうか?
左に8ビットシフトするので、3×2^8をすればいいのでしょうか?
これが理解できれば、他の部分も全て理解できると思います。
以上、長文になってしまいましたが、分かる方ご教授願います。