ページ 1 / 1
CheckHitKey関数の制御
Posted: 2009年12月07日(月) 12:06
by rrr
CheckHitKey(KEY_INPUT_RETURN)==1) a=a+1;
として場合一回のエンターキーで以上にaの値が増えてしまします。
一回のエンターキーでaを1だけふやすことは可能でしょうか?
お願いします。Dxライブラリです。
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 12:18
by 通り
誤字が、沢山、文章も変。よく確認してから投稿しましょう。
で、入力関連はゲームプログラミングの館に書いてあります。
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 12:23
by rrr
すいませんではもう一度
CheckHitKey(KEY_INPUT_RETURN)==1) a=a+1;
実行文が上のようである時、一回のエンターキーで異常にaの値が増えてしまいます。
一回のエンターキーでaを1だけふやすことは可能でしょうか?
お願いします。Dxライブラリです。
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 12:30
by YuO
CheckHitKeyは「押した」ことを調べる関数ではないです。
「押されている」ことを調べる関数です。
十分に長い時間が空いているならばともかく,例えば1 Frameごとに調べたのであれば,
人間が「1回押した」と思っていても,コンピューターは複数回検知します。
「現在の状態」を保持しておいて,それが押下方向へ変化した場合のみ反応するようにすれば,
やりたいことができるかと思います。
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 12:33
by rrr
すいません。本当わからないで
例でいいので教えてくれると助かります。
こんな場合があるよ?とか・・・・
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 12:39
by 通り
さっきのコメントは後ろの方が大事だったのにスルーされてる‥。
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 13:49
by kazuoni
>通りさん
あまり文章の事は突っ込まない方がいいかと思います。。
実際、大学でも、多くの留学生がいるのも現状ですので、
日本語能力に全員長けているとは言い切れないと思いますから^^;
(あくまで個人的な意見ですが。。)
>例でいいので教えてくれると助かります。
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はどれ位押し続けられたかを判定してくれます。
Re:CheckHitKey関数の制御
Posted: 2009年12月07日(月) 15:42
by tk
単純に例を書いてみました。
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は触らないということなので、
前回のキー押下状態を保持し、次にキー判定するときに
前回と今回のキー押下状態をみて条件をつければいいだけではないでしょうか。