ページ 11

キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 10:28
by 史上最悪のデスペナ
ここ(http://www.plustarnet.com/aspil/Programming/c11.htm)の3つ目のサンプルコードの下で、

最初から全部判定していかなければなりません。つまり、無駄にCPUを使用することにもなりかねません。

と書かれています。まあ、これを鵜呑みにしたわけですが、
DXLibで、キー入力判定後の動作(例えばWを押したらキャラが前進するとか)をswitchを使って場合分けするにはどうしたらいいでしょうか?

こうではなく
GetHitKeyStateAll( KeyBuf )
if( KeyBuf[KEY_INPUT_W] == 1 )
{
前に進む処理
}
if( KeyBuf[KEY_INPUT_S] == 1 )
{
後ろに進む処理
}
if( KeyBuf[KEY_INPUT_A] == 1 )
{
左に進む処理
}
if( KeyBuf[KEY_INPUT_W] == 1 )
{
右に進む処理
}

こんな感じにしたいのです。
↓文法(switchに使えるのが整数のみ)という点では間違ってますがやりたいことは伝わるでしょうか?
switch(KeyBuf)
case W
前に進む処理
break:
以下略

なにかいい方法はないでしょうか?

Re: キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 10:57
by softya(ソフト屋)
その手の処理の速度はさほど気にしなくて良いのですよ。
ここを気にするなら、当たり判定とかもっと速度に関係する所を意識すべきだと思います。

逆に

コード:

switch(KeyBuf)
case W
前に進む処理
break:
以下略
だと前処理が必要だったり、同時に2つのキーを押せ無くなるなど実害のほうが多いと思います。
switch(KeyBuf)だと一意の値しか処理できませんからね。

Re: キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 11:09
by h2so5
無理にやるとしたらこんな感じでしょうか。
同時押しの処理が面倒になるだけですが...

コード:

	int KeyBufInt = KeyBuf[KEY_INPUT_W] * 1 +
					KeyBuf[KEY_INPUT_S] * 2 +
					KeyBuf[KEY_INPUT_A] * 4 +
					KeyBuf[KEY_INPUT_D] * 8;
	
	switch (KeyBufInt) {
		case 1:
			//前に進む処理
			break;
		case 2:
			//後ろに進む処理
			break;
		case 4:
			//左に進む処理
			break;
		case 8:
			//右に進む処理
			break;
		default:
			break;
	}

Re: キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 14:29
by 史上最悪のデスペナ
お二方にいただいた回答により、
やはり、無理(というか無駄)という結論に達しました。
C++ももうちょっと使い勝手がいいといいなぁと身勝手なことを思ってしまいました^^;

Re: キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 14:53
by softya(ソフト屋)
メインテーマを使い勝手なのか、CPUの負荷なのか明確にされたほうが良いと思います。
大体使い勝手の良い方法はCPU負荷を必要とします。
今回の場合は、どちらにしてもあまり良い方法が無さそうですが。

Re: キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 16:29
by ISLe
h2so5さんのコードでcase 5/*1+4*/で左前というふうに斜め判定できますし、左右同時押しのような有り得ない入力を弾けるので便利だと思いますけど。

プログラミング言語とは関係のない話ですね。
キーの状態を配列に返すというDXライブラリ、というかWin32 APIの仕様の問題です。

キーコンフィグがあったり、壁伝い移動とか斜め移動速度補正とかしたら、もっと複雑になるので、キー入力も(ついでにパッド入力も)仮想化したモジュールを作ってしまえば良いと思います。

Re: キー入力後動作をSwitchを使ってやるには?

Posted: 2011年9月19日(月) 16:43
by 史上最悪のデスペナ
ありがとうございます。
ゲームがある程度完成したら、か、行き詰ったとき、暇なときにまた考えてみます