キーボードの押下状態の取得について…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jay
記事: 314
登録日時: 14年前
住所: 大阪市
連絡を取る:

キーボードの押下状態の取得について…

#1

投稿記事 by jay » 13年前

特定の状況下で一部のキーの状態を取得できなくなってしまいます
押下状態の取得にはDXライブラリのGetHitKeyStateAll関数を使用しています

具体的には
A、Z、矢印の↑キーの状態を取得しようとしているのですが
3つをそれぞれ1つだけ押した場合は正常に押下状態を取得できます
3の内いずれか2つを取得しようとした場合にも正常に取得できます
ですが、3つを同時に取得しようとすると、最後に押した1つだけ取得できなくなります(でも→とか↓は正常に取得出来たり)

実際どうなってるのか目で見てみようと、3つのキーそれぞれに変数を割り当てて
それぞれ対応しているキーを押している間だけ値が増えるように設定した上で3つの変数を表示させてみたのですが
やはり2つまではちゃんと数値が増えて行くのに、3つ目を押してもそれに対応した変数だけ数値が増えずに0のままです(当然別々に押すとそれぞれ数値は増えていく)

別々に取得しようとすると正常に動作するのに、ある程度以上の数を同時に取得しようとすると動作がおかしくなる…
これはキーボードが原因でしょうか?

これに問題があるとは思えませんが、一応押下状態を取得している部分を記載します

コード:

//キーボードの入力状態を得る
void Keyint_Class::Get_KeyState()
{
char Key_Buf[256];

	//パッドが接続されていたら処理しない
	if(pad_flag == true)	return;

	GetHitKeyStateAll(Key_Buf);	//キーボードの入力状態を取得
	for(int i=0; i<PAD_MAX; i++)	//0番から16番まで全てチェックする
	{
		//入力があればkeyintの値を+1
		//keyconfig配列に取得するキーの数値を指定してある
		if(Key_Buf[keyconfig[Config_Key][i]]==1)	keyint[i]++;
		//無ければ0にする
		else keyint[i]=0; 
	}
}
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

ミーン
記事: 8
登録日時: 13年前

Re: キーボードの押下状態の取得について…

#2

投稿記事 by ミーン » 13年前

初めまして。ミーンです。
以下のクラスを利用されてはどうでしょうか?

コード:

class Keyboard
{

	private:

		int keyCnts[256];

	public:

		void Update();
		int GetKeyCount(int keyCode);

};

void Keyboard::Update()
{

	char keyStatus[256];
	GetHitKeyStateAll(keyStatus);

	for(int i = 0; i < 256; i++)
	{

		if(keyStatus[i])
		{

			this -> keyCnts[i]++;

		} else {

			this -> keyCnts[i] = 0;

		}

	}

}

int Keyboard::GetKeyCount(int keyCode)
{

	if(keyCode > 0 && keyCode < 256)
	{

		return this -> keyCnts[keyCode];

	}

	return -1;

}

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: キーボードの押下状態の取得について…

#3

投稿記事 by Dixq (管理人) » 13年前

キーボードは何を利用されていますか?
キーボードによっては3つのキーを同時に検出できない場合があります。
特にノートPCではその現象をよく耳にします。
この場合、3つ以上のキーが同時に入力できるキーボードを外付けするなどして対応する他ないのではないでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: キーボードの押下状態の取得について…

#4

投稿記事 by softya(ソフト屋) » 13年前

一般的なキーボードでも特定のキー以外は3つ同時に押せないものは結構あります。
もしどうしても3つ以上対応したい場合はゲーミングキーボード等を選ばれると確実かも。

【補足】
参考に過去記事を。
「キーの同時入力について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9175
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jay
記事: 314
登録日時: 14年前
住所: 大阪市
連絡を取る:

Re: キーボードの押下状態の取得について…

#5

投稿記事 by jay » 13年前

ん~、やっぱり原因はプログラムじゃなくてキーボードだったんですね…
どこかでそんなお話を聞いたことがあったのでもしかしたら…、とは思っていたんですけれど(苦笑)

>ミーンさん
初めまして~
一応提供して貰ったコードも試してみましたが、結果は案の定でした(苦笑)

ご協力ありがとうございます


>Dixqさん
はい、僕のは全力でノートPCでしたorz
これがキーボードで行うゲームの限界というものなのですね…、今後はこれを踏まえたうえでゲームデザインを決めねば!

とりあえず僕が3つ同時入力出来た所で、他の人(つまり実際にプレイしてくれる人が)そうであるとは限らない訳ですしね~
ちょっとシステムを見直すとします。
ご教授ありがとうございます。


>softyaさん
ん~。 一般的なものでも3つ以上押せないのは結構あるのですか…
やっぱり今後キーボードで遊ぶゲームを作る時はそこのところも考えてデザインしなきゃ、ですね~

そしてどこかで聞いた話ってこの掲示板で聞いた話だったのか(汗)
お手数おかけしました。


そんな訳で、3つ同時取得は無理なものと考えてシステムの方を見直すことで対応したいと思います
皆さん、ありがとうございました
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

閉鎖

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