C++でのリプレイの実装

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rittai_3D
記事: 524
登録日時: 7年前

C++でのリプレイの実装

#1

投稿記事 by Rittai_3D » 5年前

お久しぶりです。3Dです。今回は自分が練習としてリプレイ機能を作成しました。しかし、思ったような挙動にならないので質問させていただきます。

下に貼ってありますReplay.cppの、CReplayPly::Exec()内のReadData()が問題の場所です。
再生の部分がうまくいきません。コメントに書いてありますが、何故か2回関数を呼ばないと自分の考える挙動になりません。
Exec()の一番下のDrawFormatString()を呼び出さないと半分しか読みません。C++初心者でひどいコードではありますが、原因を教えていただきたいです。よろしくお願いします。

以下、ソースコードです。
► スポイラーを表示
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#2

投稿記事 by Rittai_3D » 5年前

また、コードに対するツッコミを書いてくださっても構いません。
ここがわかりづらい、ここはなんでこうしないの?などなど、何でもどうぞ。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#3

投稿記事 by Rittai_3D » 5年前

コードを一から書き直した方がバグの原因を潰すのに一番だと考えました。
何がおかしいかよくわかりませんが、こんなところで悩むよりは新規に書いた方が楽でしょうから、書き直します。

コードに対するツッコミも、メインであるバグの方も返信が無いのでこれ以上放置しても時間の無駄と考え解決にします。
初心者です

ISLe()

Re: C++でのリプレイの実装

#4

投稿記事 by ISLe() » 5年前

ツッコミOKということなので。

以前この掲示板やmixC++の日記で同時多発的にコントローラーモジュールの分離の話題が出たことがあります。

ユーザー操作を加工するモジュールの話題ですが、リプレイも含まれていました。

コントローラーモジュールからユーザー操作のステータスを取得するインターフェースを定義します。
そのインターフェースを継承してリプレイモジュールを作成します。
元のコントローラーモジュールとアプリケーションのあいだにリプレイモジュールを噛まします。

リプレイモジュールは…
記録時は元のコントローラーモジュールのステータスを取得し、記録し、元のステータスをそのまま要求元に返す
再生時は元のコントローラーモジュールのステータスを無視し、記録しておいたステータスを読み出して要求元に返す
というふうにします。

同じインターフェースなので要求元のアプリケーションから生のステータスを返すモジュールかリプレイモジュールかを区別せずに扱えます。

ユーザー操作をビットにまとめた整数値をコントローラーモジュールの出口ですげ替えるだけなので、冗長で複雑なコードは必要ありません。

過去ログを探せば参考になるトピックが見付かるのではないでしょうかね。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#5

投稿記事 by Rittai_3D » 5年前

>ISLe()さん
返信ありがとうございます。
コントローラーモジュールからユーザー操作のステータスを取得するインターフェースを定義します。
そのインターフェースを継承してリプレイモジュールを作成します。
元のコントローラーモジュールとアプリケーションのあいだにリプレイモジュールを噛まします。
ユーザー操作のステータスについてなのですが、No1で示したKey.cpp/hのような設計にせず、もっと抽象的(?)にしたほうがよいのでしょうか?

たとえば、

コード:

GetKeyState( KEY_INPUT_Z );// ここでのZキーはショットだとします
のように、特定のキーが押されたという判定ではなく、

コード:

IsPushedShot(); // ショットキーが押された
のようにショットキーが何でも外部には関係ないようにしてしまうのか、教えてください。
リプレイモジュールは…
記録時は元のコントローラーモジュールのステータスを取得し、記録し、元のステータスをそのまま要求元に返す
再生時は元のコントローラーモジュールのステータスを無視し、記録しておいたステータスを読み出して要求元に返す
というふうにします。

同じインターフェースなので要求元のアプリケーションから生のステータスを返すモジュールかリプレイモジュールかを区別せずに扱えます。
なるほど。
区別せずに扱えると「もし保存モードなら~」とか「もしリプレイなら~」などのようなif文が消えますね。

コントローラーの設計はまともにしたことがないので、しっかりした設計をしてみます。
オフトピック
バグの原因が分かったので一応報告しておきます。複数のキーが同時押しされるとCReplayPly::Exec()内のif文が成立せずに止まってしまうことが原因でした。(==にならない)
現在は修正は終わり、リファクタリングしております。
初心者です

ISLe()

Re: C++でのリプレイの実装

#6

投稿記事 by ISLe() » 5年前

#たまにしか来ないので返信が遅れることご了承ください。

ステータスの抽象化については、先に書いた過去トピックでのコントローラーモジュールの分離の話題が正にそれなので参照していただくと吉かと思います。
過去ログにあるのは、いわゆるキーコンフィグ機能といったステータスの入れ替えなども同様に独立したモジュールで実装して、あとはモジュールの連結だけで追加変更削除が可能になるという話です。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#7

投稿記事 by Rittai_3D » 5年前

>ISLe()さん

返信ありがとうございます。
http://dixq.net/forum/viewtopic.php?f=3&t=12998#p104155
を参考にしてみます。Javaのコードの読解とC++での書き直しで時間がかかると思います。
オフトピック
ビット演算があまり理解出来ていないので、コード中のビット演算の解説がほしいです。
図々しいお願いですが、解説してくださると幸いです。
初心者です

ISLe()

Re: C++でのリプレイの実装

#8

投稿記事 by ISLe() » 5年前

ビット演算をコードとともに説明してもビット演算子の説明にしかならないのでビット演算子を勉強してくださいとしか言えません。
ビット演算している箇所はさほどないのでどこが分からないのか具体的に指定していただけると良いのですが。

リンク先のコードではJavaの32ビットint型の整数値の下位4ビットに上下左右の押下状態を格納しています。
これがいわゆる抽象化です。

いまどきのゲームパッドがサポートする入力をまとめて扱うなら構造体形式にする必要があるでしょう。
しかしそれをそのままアプリに渡してもアプリ側でいちいち必要な情報を引き出すのは面倒です。
アプリごとに(デジタル4方向+2ボタンといった)理想とするゲームパッドを定義して、その形に加工するモジュールを噛ませば、アプリはいつでも同じ手段で必要な情報にアクセスできるわけです。
#理想のゲームパッドを定義する話も以前書いた気がしますがどこだったか。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#9

投稿記事 by Rittai_3D » 5年前

>>ISLe()さん

返信ありがとうございます。

ビット演算はなんとか自分で理解できました。
プログラムを眺めたり頭の中で考えると混乱することに今更ながら気が付き、手を動かして下位4ビットの動きを確認して見ましたら理解できました。
オフトピック
最初分からなかった所はKeyInputのkeyPressed()のmask<<=1の処理とkeystate|= mask と
keyReleased()の keystate &= ~mask でした。
リンク先のプログラムについての質問なのですが、keyInput()のコンストラクタの引数にint型配列を渡していますが、C++ で書く場合はvectorやlistを利用した方が良いのでしょうか?
初心者です

ISLe()

Re: C++でのリプレイの実装

#10

投稿記事 by ISLe() » 5年前

3D_3D さんが書きました:リンク先のプログラムについての質問なのですが、keyInput()のコンストラクタの引数にint型配列を渡していますが、C++ で書く場合はvectorやlistを利用した方が良いのでしょうか?
その部分は、仮想ゲームパッドの機能と実際に使用するキーの対応表なので、各要素へのランダムなアクセスを高速にできることが望ましいです。

ISLe()

Re: C++でのリプレイの実装

#11

投稿記事 by ISLe() » 5年前

ISLe() さんが書きました:
3D_3D さんが書きました:リンク先のプログラムについての質問なのですが、keyInput()のコンストラクタの引数にint型配列を渡していますが、C++ で書く場合はvectorやlistを利用した方が良いのでしょうか?
その部分は、仮想ゲームパッドの機能と実際に使用するキーの対応表なので、各要素へのランダムなアクセスを高速にできることが望ましいです。
訂正。
変換に使う対応表はランダムアクセスしませんでした。
順番に各要素を回せれば良いので、vectorやlistでも構わないです。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#12

投稿記事 by Rittai_3D » 5年前

>ISLe()さん

返信ありがとうございます。
とりあえず、vector<int> にしてみました。

Javaの入門したてで、コードの読解はKeyEventあたりで止まっています。
KeyEventのgetKeyCode()はC++だとどう表現すれば良いのでしょうか?

Dxライブラリ使用なので、keyPressed()やkeyReleased()の中のforをfor( int i=0 ; i<256 ; i++ );としてしまうのでしょうか?また、それ以外の方法はあるのでしょうか?
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#13

投稿記事 by Rittai_3D » 5年前

追加で質問です。

JavaのコードではkeyPressed()もkeyReleased()も呼び出されて無いように思いますが、実際に動かしてみるとちゃんとキーの入力の通りに動います。

どこでkeyPressed()やkeyReleased()を呼び出しているのでしょうか?
初心者です

ISLe()

Re: C++でのリプレイの実装

#14

投稿記事 by ISLe() » 5年前

3D_3D さんが書きました:どこでkeyPressed()やkeyReleased()を呼び出しているのでしょうか?
そこはJavaSEのAWTというフレームワークが処理しています。
KeyListnerというインターフェースで定義してシステムに登録すると、キーが押されたときにkeyPressedが、キーが離されたときにkeyReleasedが自動的に呼び出される仕組みです。
keyPressedやkeyReleasedでは押下状態の変化に合わせてステータスを格納する変数を各ビットごとに更新しています。

C++にこのようなイベント処理機能は標準で付いてませんので何らかのライブラリを利用する必要があります。
例えばDXライブラリでは押下状態を一括で取得するのが王道です。
その場合Javaのサンプルコードのように各ビットごとではなく一括で処理するのでkeyPressedやkeyReleasedに該当するものは不要です。

『龍神録プログラミングの館』の『キーコンフィグに対応させてみよう』の章がこの部分と似た内容なのでそちらも参照してみてください。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#15

投稿記事 by Rittai_3D » 5年前

かなり返信が遅れてしまったことをお詫び申し上げます。

キー入力クラスが上手く作れず、放置してしまいました。
まだリプレイは実装していませんが、キー入力クラスはこの程度でよいのでしょうか?

ソースコード
► スポイラーを表示
ゲームパッドの対応は今のところ考えていません。
まだリプレイ部分は作っていません。私用でなかなか時間が取れなくて書けません。
初心者です

ISLe()

Re: C++でのリプレイの実装

#16

投稿記事 by ISLe() » 5年前

キーマップからステータスに変換するのはCKeyInputクラス側でないといけないですね。

ゲームパッドの対応は考えていないとおっしゃっていますが、キー入力とゲームパッド入力ともに共通のインターフェースを持って、CControllerに対して抽象化されたステータスを返すようにしないと、新しいクラスを作っては継ぎ接ぎするようなことになってしまいますよ。

いまの時点でネイティブな入力から仮想の入力へのインターフェースを考えておく必要があります。
その点で元ネタのJavaのサンプルコードがコントローラークラスの中でキークラスのインスタンス化をしているというのはマズかったですね。
勘違いさせてしまいましたね。ごめんなさい。


キークラスやゲームパッドクラスは、ネイティブな入力を仮想ステータスに変換します。
キーコンフィグはこちら。

コントローラークラスは仮想ステータスをアプリ側の設定に応じてさらに変換します。
OKとキャンセルを逆にするとか、画面の回転に対応するとかはこちら。
物理的にコントローラーが複数接続されたとき選択的に処理する部分とか。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#17

投稿記事 by Rittai_3D » 5年前

返信ありがとうございます
キーマップからステータスに変換するのはCKeyInputクラス側でないといけないですね。
とはどういう意味でしょう?
eGameKeyやKeyInputData_tをCKeyInputクラスで行う、ということでしょうか?
ゲームパッドの対応は考えていないとおっしゃっていますが、キー入力とゲームパッド入力ともに共通のインターフェースを持って、CControllerに対して抽象化されたステータスを返すようにしないと、新しいクラスを作っては継ぎ接ぎするようなことになってしまいますよ。

いまの時点でネイティブな入力から仮想の入力へのインターフェースを考えておく必要があります。
その点で元ネタのJavaのサンプルコードがコントローラークラスの中でキークラスのインスタンス化をしているというのはマズかったですね。
勘違いさせてしまいましたね。ごめんなさい。
ゲームパッドは今の時点では必要ないかな、と思っていましたが、将来的に考えておいたほうがよいのでしょう。
ゲームパッドも意識したコードを書きたいと思います。

>CControllerに対して抽象化されたステータスを返す
という部分ですが、抽象化されたステータスとは、わたしが載せたコードでは

コード:

 return m_KeyData[ ( int )eKey ].nInputCnt; 
の部分なのでしょうか?それとも全然違う部分なのでしょうか?

>ネイティブな入力から仮想の入力へのインターフェース
は、CKeyInputクラスとCControllerクラスがあわさった感じでしょうか?
キー入力を作っていて、この辺りが一番分からない部分です。

(実際のキーコードを受け持つ)->(実際のキーコードを抽象化して曖昧にする(日本語にしにくい)この辺でキーコンフィグを実装?)->(ゲーム)

のような感じでしょうか?
キークラスやゲームパッドクラスは、ネイティブな入力を仮想ステータスに変換します。
キーコンフィグはこちら。

コントローラークラスは仮想ステータスをアプリ側の設定に応じてさらに変換します。
OKとキャンセルを逆にするとか、画面の回転に対応するとかはこちら。
物理的にコントローラーが複数接続されたとき選択的に処理する部分とか。
混乱してきてしまいました。
ネイティブな入力を受け持つクラスがあり、キークラスやゲームパッドクラスは、それを仮想ステータスに変換する、とありますが、
わたしが載せたコードで言うCKeyInputが(現段階で)ネイティブな入力を受け持つクラスということと、
CControllerが(現段階で)仮想ステータスに変換するクラス、という解釈でよいのでしょうか?

理解力が乏しくて申し訳ありません。
初心者です

ISLe()

Re: C++でのリプレイの実装

#18

投稿記事 by ISLe() » 5年前

コントローラークラスは、アプリ側が理想とするコントローラーの要件を仮想的に表現するものです。

キー入力クラスは、フルキーボードを相手にしないといけませんから、ときにはアプリが気にする必要のないキーを処理する必要があります。

設計として、コントローラークラスが上位、キー入力・パッド入力クラスは下位になりますから、下位の実装によって上位を変更しなければいけない事態は避けなければいけません。

よって、キー入力・パッド入力クラスがコントローラークラスに通知する情報は、コントローラークラスによって定義されていなければいけません。

eGameKeyは仮想コントローラーの情報として抽象化されているので使えます。

KeyInputData_tはキーコードが含まれているので、コントローラークラスが扱ってはいけません。
キー入力クラスで閉じていなければいけません。

もちろんそれ以外の新たなフォーマットを定義してもかまいません。


例えば、アナログの方向キーをサポートするとします。
少し倒すとキャラは歩き、大きく倒すとキャラは走るというよくある仕様だとします。
キー入力にも対応しようとしました。
カーソルキーを連続で押し後押し続けると走るようにするか、特殊キーと組み合わせて押すと走るか、それとも…
と試行錯誤することになりました。
さて、試行錯誤しているあいだ、どのクラスをいじくりまわすことになるでしょう。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#19

投稿記事 by Rittai_3D » 5年前

数日間、色々悩んだ結果、このコードができました。
► スポイラーを表示
本当は、BaseInputクラスなるものを作り、それをKeyboardInputクラスとGamepadInputクラスに継承してControllerクラス内で
std::vectorやstd::listにしてイテレータで更新処理などをしたかったのですが、DxLibはキーボードからの入力も、ゲームパッドからの入力も一括で処理できるそうなのでこのようにしてしまいました。(CKeyInput::Proc()内)
わざわざ一括で処理できるのに複数のクラスを作る意味はあるのか?と考えた結果です。

キーボード入力クラスとゲームパッド入力クラスに分けたほうがよいのでしょうか?
例えば、アナログの方向キーをサポートするとします。
少し倒すとキャラは歩き、大きく倒すとキャラは走るというよくある仕様だとします。
キー入力にも対応しようとしました。
カーソルキーを連続で押し後押し続けると走るようにするか、特殊キーと組み合わせて押すと走るか、それとも…
と試行錯誤することになりました。
さて、試行錯誤しているあいだ、どのクラスをいじくりまわすことになるでしょう。
コントローラクラスだと思います。

たとえば、特殊キーとの組み合わせの場合は特殊キーの仮想キーを追加して、その仮想キーが押されていたら走る、
連続押しなら、仮想キーの入力フレームを取得し、フレームが一定以上押されたら走る、とわたしならします。

これらは、特殊キーのキーコードを意識する必要がないので、キー入力クラスはいじくる必要はありません。
つまり、いじくりまわすクラスはコントローラだと思います。

#追記 コードにバグがあることに気づきました。PAD_INPUT_11に対応するキーがキーボードに無いです。修正する暇が無いので、修正は大分後になりますことをご了承下さい。
初心者です

ISLe()

Re: C++でのリプレイの実装

#20

投稿記事 by ISLe() » 5年前

3D_3D さんが書きました:キーボード入力クラスとゲームパッド入力クラスに分けたほうがよいのでしょうか?
設計を実装に合わせるのは本末転倒なのでは?
3D_3D さんが書きました:コントローラクラスだと思います。
ゲームパッドに特殊キーはないのに、キー入力とゲームパッド入力を総括するコントローラークラスが特殊キーを扱うのでしょうか。
それだと扱う対象が増えるたびに、コントローラークラスの実装に条件分岐が増えていくのでは?

今回たまたまインターフェースが流用できただけで意図したものではないですよね。

全部キー入力に見立ててしまうというのもありと言えばありですが、たぶんそういう使用目的も想定してないですよね。

コントローラークラスで扱う情報が増えると、このトピックの元々の主旨にあるリプレイに必要な情報も無駄に増えますよね。


例えは既存のものではない方が良かったですかね。
追加でアプリに最適化したスクリーンキーボードやスクリーンゲームパッドを独自に実装するとしたらどうしますか?

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#21

投稿記事 by Rittai_3D » 5年前

>ISLe()さん
返信ありがとうございます。
ゲームパッドに特殊キーはないのに、キー入力とゲームパッド入力を総括するコントローラークラスが特殊キーを扱うのでしょうか。
それだと扱う対象が増えるたびに、コントローラークラスの実装に条件分岐が増えていくのでは?

今回たまたまインターフェースが流用できただけで意図したものではないですよね。

全部キー入力に見立ててしまうというのもありと言えばありですが、たぶんそういう使用目的も想定してないですよね。

コントローラークラスで扱う情報が増えると、このトピックの元々の主旨にあるリプレイに必要な情報も無駄に増えますよね。
すいません、思い違いをしていました。
コントローラークラスはキー入力クラスとパッド入力クラスの総括をするクラスですよね。
よって、キー入力クラスだと思います。

また、今現在考えている入力装置はキーボードと、可能ならばゲームパッドです。
Dxライブラリはキーボードもゲームパッドも同時に処理できるので一括にしてしまいました。
追加でアプリに最適化したスクリーンキーボードやスクリーンゲームパッドを独自に実装するとしたらどうしますか?
わたしなら、スクリーンゲームパッドクラスやスクリーンキーボードクラスを作り、コントローラークラスを挟みます。
初心者です

ISLe()

Re: C++でのリプレイの実装

#22

投稿記事 by ISLe() » 5年前

3D_3D さんが書きました:
追加でアプリに最適化したスクリーンキーボードやスクリーンゲームパッドを独自に実装するとしたらどうしますか?
わたしなら、スクリーンゲームパッドクラスやスクリーンキーボードクラスを作り、コントローラークラスを挟みます。
結果的にどういう状況になるのかよく分かりませんね。


スクリーンゲームパッドクラスは、ゲームパッドクラスと同様に扱えるようにインターフェースを用意したとします。
スクリーンキーボードクラスは、キーボードクラスと同様に扱えるようにインターフェースを用意したとします。
それらを総括するコントローラークラスは、スクリーン〇〇かどうかを気にする必要ありませんね。

文字入力が欲しいとき、キーボードクラスのインターフェースを使えば、キーボードとスクリーンキーボードが同列に利用できますね。

DXライブラリではこうだから、という理由で設計を決めるのは非常に良くないですね。
ちゃんとオブジェクト指向するならキーボードとかゲームパッドとかの対象を抽象化すべきだと思います。

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#23

投稿記事 by Rittai_3D » 5年前

>ISLe()さん
返信ありがとうございます。
スクリーンゲームパッドクラスは、ゲームパッドクラスと同様に扱えるようにインターフェースを用意したとします。
スクリーンキーボードクラスは、キーボードクラスと同様に扱えるようにインターフェースを用意したとします。
それらを総括するコントローラークラスは、スクリーン〇〇かどうかを気にする必要ありませんね。
ということは、例えばプレイヤークラスで、あるキーが入力されたらこういうアクションを起こす、という場合も、入力装置がキーボードでもゲームパッドでも関係ないということですね。

だいぶ分かって来た気がします。
DXライブラリではこうだから、という理由で設計を決めるのは非常に良くないですね。
ちゃんとオブジェクト指向するならキーボードとかゲームパッドとかの対象を抽象化すべきだと思います。
なるほど。Dxライブラリだけに特化した作りではなくて、どんな場合にも対応できるようなものがよろしいのですね。
作り直してみます。もしかしたら、私用で少し返信が遅れるかもしれません。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#24

投稿記事 by Rittai_3D » 5年前

色々と作り直してみました。手元にゲームパッドがない状態なので、ゲームパッドクラスが上手く動くかどうかわかりませんが、一応対応させてみました。

CGamepadInput::Proc()内の DX_INPUT_PAD1 を DX_INPUT_KEY_PAD_1 にした時の動作は正常でした。しかし、ゲームパッドを接続しての確認は出来ていません。
また、CController::Get()内の三項演算子ですが、もっとよい書き方を出来ればと思いましたが、これ以外は思いつかずにこうしてしまいました。ここは、改良したいけど、どうしてよいかわからない部分です。わたしが考えた方法は、Get()内でvector<int>と動的配列を宣言して、m_pInputの分だけpush_back()してやり、std::sort()などでソートして、一番大きい値を戻り値として返す、なのですが、上手くコードにできなくて、渋々こうしました。

また、呼び出し側はゲームパッドからの入力でもキーボードからの入力でも気にする必要がないようにしてみたつもりです。
おかしい部分などがありましたら教えてください。

以下、ソースコード
► スポイラーを表示
初心者です

ISLe()

Re: C++でのリプレイの実装

#25

投稿記事 by ISLe() » 5年前

あいかわらずDXライブラリのラッパにしか見えないのです。

三項演算子の部分は、何をしたいのか分かりません。
何のためにいちばん大きい値を取り出すのでしょう。

ゲームパッドがなくても、設計を詰めていくのには関係ないと思うんですよね。
キーボードの右半分と左半分を使って、ゲームコントローラーが2つ付いてると見なせるでしょう?

トピックの最初の主旨からかなり外れてもいますし、いったん仕切りなおしたほうが良いかもしれませんね。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: C++でのリプレイの実装

#26

投稿記事 by へにっくす » 5年前

3D_3D さんが書きました:CController::Get()内の三項演算子ですが、もっとよい書き方を出来ればと思いましたが、これ以外は思いつかずにこうしてしまいました。
ISLeさんが書いていますが、三項演算子の部分は何がしたいのかホント不明です。
CContollerクラスは、各コントローラの制御を行うところですよね。
ISLeさんが書かれた以下の言葉、理解してますか?
ISLe() さんが書きました:物理的にコントローラーが複数接続されたとき選択的に処理する部分とか。
まさか一人のプレイヤーがキーボードとジョイパッド2つ使うことを想定していて、同時に何か操作をしたとき、どっちを優先するかで、三項演算子を使用? 笑
違いますよね? (少なくとも私にはそう見えますが、もしそうだったとしても間違ってます)

あなたの今までのコードからすると、キーボードやジョイパッドなど、入力装置にばかり気を取られすぎてます。
ゲームするとき、何人でプレイするのかとか、そのときどういう入力装置に割り当てられるのかとか、その辺が全然抜けていますよ。
ゲームのリプレイも、まずそういう前提があって成り立ちますよね?
視点を変えてみることをお勧めします。
ISLe() さんが書きました:トピックの最初の主旨からかなり外れてもいますし、いったん仕切りなおしたほうが良いかもしれませんね。
個人的にはそう外れているようには見えないですけどね。
まあ解決チェックされてるし、
また抽象化した後、の話になってる(明記はされていないですが何となくそういう流れかなと)から確かに仕切りなおした方がいいかも・・・
それは3Dさんの判断で。
続ける場合、かなり長いトピックになると思いますw
仕切りなおす場合、続きのリンクをはっといてくださいね。

【編集:09/13 08:50】三項演算子の解釈を詳細にする。あと細かい編集をしました。
written by へにっくす

アバター
usao
記事: 1566
登録日時: 6年前

Re: C++でのリプレイの実装

#27

投稿記事 by usao » 5年前

オフトピック
>まさか一人のプレイヤーがキーボードとジョイパッド2つ使うことを想定している?

え? そうなんじゃないですか?
手持ちのパッドだとボタン数が足りないです…という経験ありません?

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#28

投稿記事 by Rittai_3D » 5年前

ISLe()さん、へにっくすさん、usaoさん
返信ありがとうございます。

>ISLe()さん
あいかわらずDXライブラリのラッパにしか見えないのです。

三項演算子の部分は、何をしたいのか分かりません。
何のためにいちばん大きい値を取り出すのでしょう。
三項演算子につきましては、へにっくすさんのおっしゃるとおりのことをしようとしていました。
ゲームパッドとキーボードのどちらかの入力があれば、入力されている方のフレームを返すように考えました。
ゲームパッドがなくても、設計を詰めていくのには関係ないと思うんですよね。
キーボードの右半分と左半分を使って、ゲームコントローラーが2つ付いてると見なせるでしょう?

トピックの最初の主旨からかなり外れてもいますし、いったん仕切りなおしたほうが良いかもしれませんね。
なるほど。そのような見方があるのですね。ゲームパッドはゲームパッドと固執しすぎたと思います。もっと柔軟な発想力が必要ですね。
また、トピックは新規に作ろうと思います。タイトルがリプレイなのに、中身はキークラスと別物になっていますし。

主題であるリプレイのバグの原因もわかりましたので、いったんこのトピックは終わりにしようと思います。


>へにっくすさん
ISLeさんが書いていますが、三項演算子の部分は何がしたいのかホント不明です。
CContollerクラスは、各コントローラの制御を行うところですよね。
ISLeさんが書かれた以下の言葉、理解してますか?
自分なりに理解しているつもりです。詳しい説明は下にありますのでそちらをご覧下さい。
まさか一人のプレイヤーがキーボードとジョイパッド2つ使うことを想定していて、同じ操作をしたとき、どっちを優先するかで、三項演算子を使用? 笑
違いますよね? (少なくとも私にはそう見える)
そのまさかです。ISLe()さんへの返信にもある通り、キーボードかゲームパッド両方使用した場合、入力されている方のフレーム数を返すように考えました。
わたしは、以前パソコンゲームをしていた時に、時々、ゲーム中にゲームパッドとキーボードを気分によって使い分けていました。なので、ゲーム中にキーボードでもゲームパッドでも使用できるようにしたいと考えました。
あなたの今までのコードからすると、キーボードやジョイパッドなど、入力装置にばかり気を取られすぎてます。
ゲームするとき、何人でプレイするのかとか、そのときどういう入力装置に割り当てられるのかとか、その辺が全然抜けていますよ。
ゲームのリプレイも、まずそういう前提があって成り立ちますよね?
視点を変えてみることをお勧めします。
視点の変更ですか。やはり、入力装置だけに気を取られすぎなのでしょうかね。
少しコードは書かずに落ち着いて色々な視点で見てみるようにします。
オフトピック
手持ちのパッドだとボタン数が足りないです…という経験ありません?
そうではなくて、上にもあります通りわたしの変なプレイスタイルが原因です。
パッドだとボタンの数が足りないってことが有るのですね。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: C++でのリプレイの実装

#29

投稿記事 by Rittai_3D » 5年前

キー入力クラスの設計というトピックをたてました。
こちらのトピックを終了し、あちらで、このトピックの乖離した部分を続行しようと思います。

最初に張ったコードのリプレイのバグの原因もわかり、修正も完了いました。
初心者です

ISLe()

Re: C++でのリプレイの実装

#30

投稿記事 by ISLe() » 5年前

1人のプレイヤーキャラの操作に、キーボードとゲームパッドを並用することもとうぜん考えなくてはいけませんよ。
実際にオンラインゲームとか、ゲームパッドとキーボードとマウスを組み合わせて使うことは珍しくないですから。

で、同じプレイヤーに割り当てたら、そこはどれかを選択するのではなく、入力を合成しなければいけません。
単純に合成すると矛盾するとか、より良い操作感を考慮するとか、何らかのルールに則って情報を取捨選択する必要が出てきます。
そういう部分はコントローラークラスの役割です。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: C++でのリプレイの実装

#31

投稿記事 by へにっくす » 5年前

3D_3D さんが書きました:
まさか一人のプレイヤーがキーボードとジョイパッド2つ使うことを想定していて、同じ操作をしたとき、どっちを優先するかで、三項演算子を使用? 笑
違いますよね? (少なくとも私にはそう見える)
そのまさかです。ISLe()さんへの返信にもある通り、キーボードかゲームパッド両方使用した場合、入力されている方のフレーム数を返すように考えました。
わたしは、以前パソコンゲームをしていた時に、時々、ゲーム中にゲームパッドとキーボードを気分によって使い分けていました。なので、ゲーム中にキーボードでもゲームパッドでも使用できるようにしたいと考えました。
んーそういうことなのですか。
今のゲームは違うのですねえ。
無知をさらしてしまいました・・・orz。
written by へにっくす

閉鎖

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