ページ 11

キー制御について

Posted: 2014年11月24日(月) 17:02
by JON
DXライブラリにて、エンターで進む処理について質問です。
RPGでエンターで戦うボタンを選択し、攻撃対象を選んでからエンターで攻撃。のような、エンターでの操作が続く場合です。GetHitKeyStateAllでキーの状態を取得し、if(Key[KEY_INPUT_RETURN] == 1)を二回続けてしまうと一度に処理されてしまうので、今はカウントを数えたりフラグを立てたりで処理しています。しかし、プログラムが長くなるにつれごちゃごちゃしてくるので他にもっと良い考えがあるのではないかと感じています。

そこで、同じキーで進める操作の場合はどのようにするのがベストな考えなんでしょうか?

Re: キー制御について

Posted: 2014年11月24日(月) 22:40
by zxc
 基本的にカウントかフラグで管理するのが分かりやすく一般的な方法だと思いますし、それでごちゃごちゃするというのは別の問題だと思います。何度も登場する処理を関数やクラスと言う容易に再利用できる形にしないことがごちゃごちゃしたコードの原因ではないか、もう一度コードを見直してみてはいかがでしょうか。

Re: キー制御について

Posted: 2014年11月24日(月) 22:49
by Ketty
ソースがごちゃごちゃするというのは、
if(Key[KEY_INPUT_RETURN] == 1)を二回続けてしまうと一度に処理されてしまうので、今はカウントを数えたりフラグを立てたりで処理しています
これを、ゲーム本編の処理に書きこんでいるから、ごちゃごちゃするとおっしゃってるのでしょうか(?_?)
であれば、関数化するなりクラス化するなりして、分離すればいいと思います。

ベストのやり方は知らないですが、
私の場合は、キー入力管理の処理をクラス化して、
キークラス.isPressed()とか、キークラス.isPressedOnce()といった具合に、
押されたよ、とか、1回だけおされたよ、とかいうのをメソッドにしますかね(^v^)
JONさんが「ごちゃごちゃしてる」とおっしゃる部分を、キークラスに引き受けてもらう感じです。

Re: キー制御について

Posted: 2014年11月25日(火) 10:24
by softya(ソフト屋)
このサイトのコンテンツである「ゲームプログラミングの館」
http://dixq.net/g/
この中にある「 DXライブラリの関数の使い方(基本) 」の「全てのキーの入力状態を取得する」は参考にならなかったのでしょうか?
狙いとなる機能を実現していると思いますが。

Re: キー制御について

Posted: 2014年11月25日(火) 11:34
by JON
カウントやフラグで管理するのが一般的なんですね。ごちゃごちゃするというのは、フラグの数が多くなってしまうということでした。言葉足らずですみません。

「DXライブラリの関数の使い方(基本)」の「全てのキーの入力状態を取得する」のところは参考にさせていただいています。選択画面など一つの処理のときや、連続する処理に必要なキーが違うときは問題ないのですが、違う処理で同じキーを使うことが続く場合に問題が生じます。
キーを押して最初の処理は通って、次の処理は一回キーを離してもう一度押して通したいと考えています。

やはりフラグなどは処理ごとに用意したほうが管理しやすいですよね?

Re: キー制御について

Posted: 2014年11月25日(火) 13:14
by softya(ソフト屋)
> キーを押して最初の処理は通って、次の処理は一回キーを離してもう一度押して通したいと考えています。

それこそキーを離している状態を監視する関数を用意するだけす。
1.状態0 → 条件(ENTERキーカウント==1) → 状態1
2.状態1 → 条件(ENTERキーカウント>1) → 状態2
3. 状態1か2 → 条件(ENTERキーカウント==0) → 状態0
これを何らかの関数やクラスでラップしてしまえば、現在が状態1かを返す関数を用意するだけで目的の動作は達成できませんか?

Re: キー制御について

Posted: 2014年11月25日(火) 22:24
by JON
なるほど、参考になります。

頭ではある程度形になっていても実際にプログラムを書いてみるとなかなか難しいところもあります。
色々考えながら試行錯誤してみます。

Re: キー制御について

Posted: 2014年11月26日(水) 20:50
by JON
解決押し忘れてました。

また行き詰ったときはよろしくお願いします。