CheckHitKey関数の制御

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

CheckHitKey関数の制御

#1

投稿記事 by rrr » 15年前

CheckHitKey(KEY_INPUT_RETURN)==1) a=a+1;

として場合一回のエンターキーで以上にaの値が増えてしまします。
一回のエンターキーでaを1だけふやすことは可能でしょうか?
お願いします。Dxライブラリです。

通り

Re:CheckHitKey関数の制御

#2

投稿記事 by 通り » 15年前

誤字が、沢山、文章も変。よく確認してから投稿しましょう。

で、入力関連はゲームプログラミングの館に書いてあります。

rrr

Re:CheckHitKey関数の制御

#3

投稿記事 by rrr » 15年前

すいませんではもう一度

CheckHitKey(KEY_INPUT_RETURN)==1) a=a+1;

実行文が上のようである時、一回のエンターキーで異常にaの値が増えてしまいます。
一回のエンターキーでaを1だけふやすことは可能でしょうか?
お願いします。Dxライブラリです。

YuO

Re:CheckHitKey関数の制御

#4

投稿記事 by YuO » 15年前

CheckHitKeyは「押した」ことを調べる関数ではないです。
「押されている」ことを調べる関数です。

十分に長い時間が空いているならばともかく,例えば1 Frameごとに調べたのであれば,
人間が「1回押した」と思っていても,コンピューターは複数回検知します。


「現在の状態」を保持しておいて,それが押下方向へ変化した場合のみ反応するようにすれば,
やりたいことができるかと思います。

rrr

Re:CheckHitKey関数の制御

#5

投稿記事 by rrr » 15年前

すいません。本当わからないで
例でいいので教えてくれると助かります。
こんな場合があるよ?とか・・・・

通り

Re:CheckHitKey関数の制御

#6

投稿記事 by 通り » 15年前

さっきのコメントは後ろの方が大事だったのにスルーされてる‥。

kazuoni

Re:CheckHitKey関数の制御

#7

投稿記事 by kazuoni » 15年前

>通りさん
あまり文章の事は突っ込まない方がいいかと思います。。
実際、大学でも、多くの留学生がいるのも現状ですので、
日本語能力に全員長けているとは言い切れないと思いますから^^;
(あくまで個人的な意見ですが。。)


>例でいいので教えてくれると助かります。
Yuoさんのおっしゃっていること以上うまく説明できる気がしないですが・・・
今我々が使っているパソコンはいろいろな処理がものすごい高速で、
例えば、管理人さんの作成された四聖龍神録はFPS=60で管理されています。
これはメインループを一秒間に60ループさせています。
FPSを管理していないならば、それ以上に高速になるかもしれません。
その中で、人間がキーを一回押してから離すのは早くても0.1秒はかかると思います。
(ストップウォッチを高速でstart,stopしても記録は良くて0.1秒とかですよね)
パソコンは少なくとも0.1秒間は「入力があり」の状態になるわけです。(Key[KEY_INPUT_RETURN]==1)
60*0.1=6なので、aは少なくとも6回分1が足されるわけです。

#ちなみに、管理人さんの作成された関数GetHitKeyStateAll_2はどれ位押し続けられたかを判定してくれます。

tk

Re:CheckHitKey関数の制御

#8

投稿記事 by tk » 15年前

単純に例を書いてみました。
GetHitKeyStateAll_2は使っていません。

なるべく初心者の方でもわかるように、最低限のC言語の知識だけで
分かりやすいように書いたつもりです。

SetDrawScreenとかは好き好んで使っているだけなので、無視してもいいです。

int a = 0;
BOOL Zenkai = FALSE;      // 前回のキー押下状態
BOOL Konkai = FALSE;      // 今回のキー押下状態

ChangeWindowMode(TRUE);   // ウィンドウモード

if( DxLib_Init() == -1 ){                    // エラー発生時
	return -1;                          // 終了させる
}

SetDrawScreen( DX_SCREEN_BACK );             // 描写を裏画面に

while( TRUE ){
	if( CheckHitKey( KEY_INPUT_RETURN ) == 1 ){    // エンターが押されていたら
		Konkai = TRUE;                      // 今回の状態を押下状態に
	}

	if( Konkai == TRUE && Zenkai != Konkai ){    // エンターキーが押下状態 かつ
                                                      // 押下状態ではない → 押下状態 への変化のみ
		a++;                                // aを+1する
		printfDx( "現在の a の値は %d です。\n", a );
                                                      // 文字出力
		ScreenFlip();                       // 裏画面を表に描写
	}

	Zenkai = Konkai;                             // 今回の押下状態を前回に設定
	Konkai = FALSE;                              // 今回の押下状態をクリア

	if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ){  // ESCキー押下時
		break;                              // ループを抜け終了させる
	}
}

DxLib_End();                                          // DXライブラリ終了処理

return 0;


要は、Enterが押された瞬間にaを+1して、
Enterが持続的に押されている間はaは触らないということなので、
前回のキー押下状態を保持し、次にキー判定するときに
前回と今回のキー押下状態をみて条件をつければいいだけではないでしょうか。

閉鎖

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