特定のキーが押されるまで待つ

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

特定のキーが押されるまで待つ

#1

投稿記事 by 奥兵 » 14年前

現在サイトを見ながら簡単なスクリプトを作っているのですが
文字を表示した後、特定のキーが押されるまで処理を待つようにしたいのですがうまくいきません。
ループを使うと走らせた際に「"プログラム名".exeは応答していません」となってしまいます。
エンター、もしくはスペースが押されるまで待ちたいのですが・・・


VC2008 DXライブラリ使用 OSは7です
C++歴は半年ありません


↓問題の部分です

コード:

int Print(char* string){

	char KeyBuf[ 256 ] ;
	GetHitKeyStateAll( KeyBuf ) ;
	
	int x=40;
	int y=500;
	static char* string1;
	static char* string2;

	string2=string1;
	string1=string;

	if(string2==NULL){
		string2="";
	}
	SetFontSize( 26 ) ;

	


	DrawFormatString(x,y,GetColor(255,255,255),"%s",string1);
	DrawFormatString(x,y+26,GetColor(255,255,255),"%s",string2);
    //ここで待ちたいのですが・・・
	for(;;){
		GetHitKeyStateAll( KeyBuf ) ;
		if((KeyBuf[ KEY_INPUT_RETURN ]==1)
				||(KeyBuf[KEY_INPUT_SPACE==1])){
			break;
		}
	}
	
	return 0;
}

アバター
a5ua
記事: 199
登録日時: 14年前

Re: 特定のキーが押されるまで待つ

#2

投稿記事 by a5ua » 14年前

以下のような“状態遷移”を実現する必要があります。

コード:

[文字表示]
  ↓
[入力待ち]
  ↓ キーが押された
  …
[]でくくった箇所がひとつの状態を表し、↓の横に書いてあるのが遷移の条件を表します。
何も書かれていない場合は、無条件で即座に遷移するものとします。

最も単純な方法は、switch-case文による分岐です。以下のサンプルプログラムを示します。
参考にしてみてください。
► スポイラーを表示
このプログラムは、1秒間実行したあと入力待ちをし、キーが入力されたら再び1秒間実行を繰り返すものです。
状態遷移図を書くと以下のようになります。

コード:

        ↓
      [初期化]
        ↓
特定の ┌→[実行中]
キーが │   ↓ 実行開始から1秒間経過
押された└─[入力待ち]
現在の状態を保持する変数としてphaseを用意し、phaseの値によって処理をswitch-caseで振り分けます。
ここでは、各フェイズの処理関数は次のフェイズを表す値を返すようにしてみました。

コード:

// フェイズの更新
phase = UpdatePhase(phase);
この部分で、特定の条件を満たしたときにはphaseが変更されるので、状態遷移が実現できます。
(値が変わらない場合は、フェイズが継続していることを意味する)

何か分からないことがありましたら、言ってください。

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Re: 特定のキーが押されるまで待つ

#3

投稿記事 by バグ » 14年前

待機するだけでしたら、下記のようにWaitKey関数を使えばいいのではないでしょうか?
WaitKey関数でしたら、待機中もProcessMessage関数が実行されていますから、固まってしまうことはないと思います。

コード:

for (; ;)
{
	int key = WaitKey();
	if (key == KEY_INPUT_RETURN || key == KEY_INPUT_SPACE)
	{
		break;
	}
}

奥兵

Re: 特定のキーが押されるまで待つ

#4

投稿記事 by 奥兵 » 14年前

お二人とも素早い御返事ありがとうございます。
おかげで無事解決することができました。
今回は簡単そうだったのでWaitKeyを使う事にしました。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 特定のキーが押されるまで待つ

#5

投稿記事 by ISLe » 14年前

バグ さんが書きました:WaitKey関数でしたら、待機中もProcessMessage関数が実行されていますから、固まってしまうことはないと思います。
WaitKey関数を実行中にアプリが終了する可能性を考慮しないと無限ループに陥ることはありそうですけど。

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Re: 特定のキーが押されるまで待つ

#6

投稿記事 by バグ » 14年前

>>ISLeさん
>>WaitKey関数を実行中にアプリが終了する可能性を考慮しないと無限ループに陥ることはありそうですけど。

そうですね、たしかに今回はそこまで考慮しておりません。
ただ、今回の質問に対しての回答という意味では問題ないかと・・・(別に意地悪で書いている訳ではありませんよ(汗))
もし、そこまで必要だというのであれば、a5uaさんの提案されている状態遷移を取り入れるのがベターでしょう。

閉鎖

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