keyの入力の判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
うい

keyの入力の判定

#1

投稿記事 by うい » 16年前

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}


この一文をただメイン関数の前に書けばもうそれでどれくらい入力されているか判定できるようになり、
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
のようなことはできるようになるのでしょうか?

GPGA

Re:keyの入力の判定

#2

投稿記事 by GPGA » 16年前

キーリピートを実装したいということですね。
こんなのはどうでしょう。

int count = 0;	// グローバル

if (キーが押されている時) {
	if (count == 0 || count == 30) {
		// 処理
	}
	if (++count >= 35) {
		count = 30;
	}
} else {
	count = 0;
}
 

GPGA

Re:keyの入力の判定

#3

投稿記事 by GPGA » 16年前

あー、質問文をちゃんと見てませんでした。
一言で言うと、「やってみればいかがですか?」に限ります。

試すことができるのに、試さないで質問するのは愚の骨頂ですよ。
まず試してみる。
それで、うまくいかなければ考える。
それでもわからなければ、質問するようにしましょう。

Dixq (管理人)

Re:keyの入力の判定

#4

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

「どれくらい」という表現がちょっと曖昧でよくわかりませんが、
int型がカウント出来る数には限界があるので、どれ位の時間その限界以内で使用できるかということでしょうか?

unsigned int はだいたい40億までカウント出来ます。

一方、60FPSでゲームを作ったとすると、

1秒で 60
1分で 60*60
1時間で60*60*60
1日で 60*60*60*24
1年で 60*60*60*24*365

ですね。
40億÷1年のカウント数
で計算してみます。

2.11.....

です。つまり2年以上キーを押しっぱなしにすると0に戻ります。
しかしまずそういうことは無いですよね。
常識的にありえなさそうなことまできちんと制御しないといけない本格的なゲームには適さないかもしれませんが、
とりあえずこれでも問題無いかと思っています。

もしそれでも気持ち悪いということならLONGLONG型を使うというのもありかもしれません。
2000京、20エクサ回カウント出来るのでこれがオーバーフローするころには地球は滅亡してるでしょう。
(キロ、メガ、ギガ、テラ、ペタ、エクサ)

うい

Re:keyの入力の判定

#5

投稿記事 by うい » 16年前

質問の仕方が悪かったみたいです。
あの一番上の長い文があると一体どうなっているのかが、説明を見てもよくわからなかったので、
少しわかりやすく説明をしてもらえるとありがたいです。

Dixq (管理人)

Re:keyの入力の判定

#6

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

渡されたKeyStateBufには現在のキー入力状態が入ります。

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}

キーボードは一つしかないでしょうから、この関数内で静的変数で用意してもいいんですが、一応引数にしてます。

とりあえずGetHitKeyStateAll_Keyには今の瞬間のキーの入力状態がはいりますよね。
今の入力状態がオンならそのキー入力状態カウンタをカウントアップします。
オフなら0にします。
そうすることで、キーがどれ位おされているかカウント出来るようになっているのです。

例えば60FPSのゲームでエンターを2秒おしっぱなしにしたら
引数[ KEY_INPUT_RETURN ] には120が入っています。

特定のキーの入力状態を表示するプログラムを作り、実際にキーを押してみたらよく解ると思います。
 

閉鎖

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