久しぶりの投稿になります。
制作中のゲームで、龍神録プログラミングの館の第8章を参考にキーコンフィグを実装中ですが、
コントローラから直接入力を受け取って、キーコンフィグを行うところで見通しが立たなくなっている状態です。
今現在はソース中で書いていたボタン割り当てを外部ファイル化して割り当てることで、コンフィグを行うということで妥協していますが、やはりゲームのオプション画面等からコントローラの入力でのコンフィグを行いたいので、アドバイスをお願いします。
----コンフィグ部分のソースは第8章とほとんど同じとなっております。-----
ゲーム画面でキーコンフィグを行う方法
Re:ゲーム画面でキーコンフィグを行う方法
>見通しが立たなくなっている
パッドでの入力がうまく取得できないという事でしょうか?
例えば設定画面で[Shotボタン]が選択中であれば、
1.龍神禄側のパッド入力判定を止める。
2.GetJoypadInputState()でパッド入力を監視
3.何かボタンが押されたら、そのボタン番号を
龍神禄のキーコンフィグのShotボタンに割り当て直す。
4.龍神禄側のパッド入力判定を再開。
大まかな流れはこんな感じになると思います。
パッドでの入力がうまく取得できないという事でしょうか?
例えば設定画面で[Shotボタン]が選択中であれば、
1.龍神禄側のパッド入力判定を止める。
2.GetJoypadInputState()でパッド入力を監視
3.何かボタンが押されたら、そのボタン番号を
龍神禄のキーコンフィグのShotボタンに割り当て直す。
4.龍神禄側のパッド入力判定を再開。
大まかな流れはこんな感じになると思います。
Re:ゲーム画面でキーコンフィグを行う方法
何で詰まっているのかあまりよくわからないのですが。
> ボタン割り当てを外部ファイル化して割り当てることで
これが出来てるんでしたら、ボタンの割り当てパターンを何種類か用意して
ユーザーに選択させれば楽じゃないでしょうか。
> ボタン割り当てを外部ファイル化して割り当てることで
これが出来てるんでしたら、ボタンの割り当てパターンを何種類か用意して
ユーザーに選択させれば楽じゃないでしょうか。
Re:ゲーム画面でキーコンフィグを行う方法
上手く伝えられなくて申し訳ありませんが、具体的にやりたい事としては、四聖龍神録Plusのconfig画面のようなことをやりたいと思っています。
SooAさんのおっしゃっているような流れはうっすらと想像できているのですが、それをどう実装するかという事で悩んでいるところです。
SooAさんのおっしゃっているような流れはうっすらと想像できているのですが、それをどう実装するかという事で悩んでいるところです。
Re:ゲーム画面でキーコンフィグを行う方法
昔作ったやつをそのままこぴぺしちゃいますので参考までに。
余分なところは切り取りました。
無駄があるかもしれませんが、ご了承ください。
基本的に、キーコンフィグ用のクラスを作りました。
(pre タグ入れ忘れて編集しましたw)
余分なところは切り取りました。
無駄があるかもしれませんが、ご了承ください。
基本的に、キーコンフィグ用のクラスを作りました。
//==ここからヘッダファイル //キー 数字でやるより、分かりやすくなる。 #define KEY_SHOT 0 #define KEY_LEFT 1 #define KEY_UP 2 #define KEY_RIGHT 3 #define KEY_DOWN 4 #define KEY_SUB 5 #define KEY_BOMB 6 #define KEY_SLOW 7 #define KEY_STOP 8 #define CONFIG_NONE -1 //configNow に使用。現在コンフィグするためにキー待ちしている状態ではないという意味。 //クラス typeInfo class typeInfo { // キーや、パッドボタンは↓のConfig配列によって変更可とする。中身の値はdxLibに使われる KEY_**** とかの値と一致。 int keyConfig[9]; int padConfig[9]; public: int configNow; //現在何をコンフィグしているかを記録。↑の0から8という値を保存。 void keyConfigUpdate(typeInfo*);//コンフィグしている間は毎フレーム呼び出す。 string whatKeyIsThis(int);//KEY_**** などの値から、キーの名前をstring で返します。string は std::string です。すでに、include したとします。 //ここにいろいろあったけど・・・・・・その他のメンバー関数と、メンバー変数は略します } //==ここからソースファイル //引数 typeInfo* otherType プレイヤー2のキーコンフィグ情報。 void typeInfo::keyConfigUpdate(typeInfo* otherType){ if(configNow == CONFIG_NONE) return; char Buf[ 256 ] ; GetHitKeyStateAll( Buf ) ; int n = 0; while(n < 256){//すべてのキー if(Buf[n] == 1){ //nキーの入力があるなら if(strcmp(whatKeyIsThis(n).c_str(),"エラー") == 0){//たまに対応していないキーがあるので。 configNow = CONFIG_NONE; //ここにエラーメッセージの処理をいれてください。 return; } //以下のfor文で、キーの重複を避けます。 //他のキーに使っているキー番号なのに、それに設定してしまってはひとつのキーでふたつのアクションを取ってしまう。 //例:↑キーと⇒キーの両方が同じコンフィグだったら困る。これはそれを回避する。 for(int i = 0; i < 9;i++){//すべてのコンフィグをチェック。 if(keyConfig == n && i != configNow){//入力したキー(n)が、コンフィグのi番目で設定したキーと等しく、さらに i == configNow が true のときは、スキップする。 keyConfig = keyConfig[configNow];//重複したキー(もともと設定してあった方)を、現在コンフィグしようとしていたものにする。 keyConfig[configNow] = n;//現在コンフィグしようとしていた方に、nキーが重複しないようになったのでnキーを割り当てる。 configNow = CONFIG_NONE;//コンフィグモード終わりを記録する。 return; } } for(int i = 0; i < 9;i++){//すべてのコンフィグをチェック。 if(otherType->keyConfig == n){//このnキーが、プレイヤー2のコンフィグのi番目で設定したキーと重複してしまった場合。 otherType->keyConfig = keyConfig[configNow]; keyConfig[configNow] = n; configNow = CONFIG_NONE;//コンフィグモード終わり。 while(Buf[n] != 0){//現在コンフィグしたキーが離されるまでループ。 GetHitKeyStateAll( Buf ); ProcessMessage(); } return; } } //押したキーは問題ない(重複やエラーがない)場合のみここまでくる。。 keyConfig[configNow] = n;//キーセット。 configNow = CONFIG_NONE;//コンフィグモード終わり。 return; } n++; } }
(pre タグ入れ忘れて編集しましたw)

Re:ゲーム画面でキーコンフィグを行う方法
返事が遅れてすみません。。。
SooAさん>
メニュー画面ではなく、1~4の実装で悩んでいるという事です。
「こういう風にやればできるんだろうな・・・」とまでは分かっていても実際にプログラム上で組むことが出来ない状況です。
MAさん>
参考にさせていただきます。
とりあえず、ソースを参考にもう少し考えてみます。
SooAさん>
メニュー画面ではなく、1~4の実装で悩んでいるという事です。
「こういう風にやればできるんだろうな・・・」とまでは分かっていても実際にプログラム上で組むことが出来ない状況です。
MAさん>
参考にさせていただきます。
とりあえず、ソースを参考にもう少し考えてみます。
Re:ゲーム画面でキーコンフィグを行う方法
SooAさん>
サンプルを見させていただきましたが、こんなことをやりたかったわけです。
他には対応するボタンが被った場合やコンフィグデータの保存等、ありますがこの辺りは自力でできそうです。
ありがとうございました!
サンプルを見させていただきましたが、こんなことをやりたかったわけです。
他には対応するボタンが被った場合やコンフィグデータの保存等、ありますがこの辺りは自力でできそうです。
ありがとうございました!