トップページ > 過去ログ > 記事閲覧
メニュー時等のキー入力検知
名前:大吾 日時: 2006/11/11 01:16

おじゃまします。 キーの入力を得る際、 while(1){ if(CheckHitKey(KEY_INPUT_RIGHT)){ ごにょごにょ } ProcessMessage(); } と記述すると思いますが、メニューなどで使用する際、ドバーァァっと流れてしまいますよね。 これを防ぐために while(1){ keybuff[256]; if(CheckHitKey(KEY_INPUT_RIGHT)){ if(keybuff[KEYINPUT_RIGHT] != 0){ keybuff[KEY_INPUT_RIGHT] = 1; ごにょごにょ } } else{ keybuff[KEY_INPUT_RIGHT] = 0; } ProcessMessage(); } というように書いているのですが、規模が大きくなるにつれごちゃごちゃとしてしまいます。 みなさんはメニューなどウェイトが必要なキー入力はどのようにして検知していますか? ご教授お願いいたします。

Page: 1 |

Re: メニュー時等のキー入力検知 ( No.1 )
名前:犬福 日時:2006/11/11 01:49

とりあえず押しっぱなしで連続移動したくないシチュエーションの処理を実現したいんですよね? 私の場合は少々冗長になりますがこんな感じでやってます。(DxInitなどは省略してます) #define KEYS (256); // キー情報保管用 bool g_bKeyOld[KEYS], g_bKeyDown[KEYS], g_bKeyPush[KEYS]; // キー情報を取得する void PollingKeys(){ char buf[KEYS]; // 現在のキー情報を全て取得  GetHitKeyStateAll(buf); // 全てのキーについて直前の押下情報を保存することによって // 継続して押されているキーと今回初めて押されたキーを区別できる for(int i = 0;i < KEYS;i++){ g_bKeyOld[i] = g_bKeyDown[i]; g_bKeyDown[i] = (buf[i] != 0) ? true : false; // 今回押されているキーはtrueとなる g_bKeyPush[i] = (g_bKeyDown[i] && !g_bKeyOld[i]); // 前回押されてなく、今回押されたキーのみtrueとなる。 } } void main(){ while(true){ PollingKeys(); // ここで一括してキー情報をグローバル変数に格納する // スペースキーが押された瞬間だけミサイルを発射 if(g_bKeyPush[KEY_INPUT_SPACE]) ShootMissile(); // とにかく右が押されていたら移動する if(g_bKeyDown[KEY_INPUT_RIGHT) MoveRight(); } } もし、押しっぱなしでも一定時間ごとに移動したい場合でもキー情報取得関数をちょっと工夫すれば簡単に実装できますよ。
Re: メニュー時等のキー入力検知 ( No.2 )
名前:犬福 日時:2006/11/11 01:54

あ・・最初の行の「;」は間違いです^^;
Re: メニュー時等のキー入力検知 ( No.3 )
名前:ソラシド 日時:2006/11/11 22:31

サンプルプログラムの7番に // キー入力待ち while( CheckHitKeyAll() != 0 ){} while( CheckHitKeyAll() == 0 ){} があるので、サンプルプログラムを見てこれを使えばメニューはできると思います。 でも、whileのところにProcessMessage();を入れておかないといけない気がします。 やりたいことと違っていたらすいません。 ttp://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N7
Re: メニュー時等のキー入力検知 ( No.4 )
名前:大吾 日時:2006/11/12 00:43

返答ありがとうございました^^ 犬福さんのやりかたでうまくいけました。 しかもこれ連続受付をするキーとしないキーが共存できますね。とてもありがたいです! *ソラシドさん 返答ありがとうございます^^ このやりかただと何かキーが押されるまで背景などの表示がされないようですね。 #このループ内に描画セット一式を記述すれば表示はされますがゴチャゴチャになってしまいますので・・ 申し訳ありませんが今回私が希望していたのとは違うようです。

Page: 1 |