クリックもしくはエンターキーの入力を待つ

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

クリックもしくはエンターキーの入力を待つ

#1

投稿記事 by タケ » 11年前

お世話になります。
Visual Studio 2010にてDXライブラリを用いた開発をしています。

テキストを表示させ、スクリプトに@wが記述されていた場合、そこで件名の通りの処理をしたいのですが、上手くいきません。

コード:

//呼び出し元
	while(!ProcessMessage() && line < scrinfo->MaxLineNum) {
		cbuf = scrinfo->Code[line][col];
		switch(cbuf) {
		case L'@':
			ProcessScript(scrinfo->Code[line][++col], &x, &y);
			break;
		default:
			DrawFormatStringToHandle(rndtxtconf->MsgInitPosX + (rndtxtconf->LetterSpace * x++), 
			rndtxtconf->MsgInitPosY + (rndtxtconf->LineHeight * y), rndtxtconf->FontColor,
			rndtxtconf->FontHandle, L"%c", cbuf);
			break;
		}
		if(scrinfo->Code[line][++col] == L'\0') {
			col = 0;
			line++;
		}
	}

//処理関数
void ProcessScript(wchar_t proccode, int* x, int* y) {
	switch(proccode) {
	case L'w':
		while(!ProcessMessage())
			if(CheckHitKey(KEY_INPUT_RETURN) == 1 || (GetMouseInput() & MOUSE_INPUT_LEFT) != 0) break;
		x++;
		break;
	default:
		break;
	}
}
WaitKey()を用いればうまくいくので、記述がおかしいのだと思いますが、どのように直せば上手くいくでしょうか。

また、今記述している処理ですと、上手くいったとしても、入力がONのままの状態で次の処理に入ってしまうと思います。
やりたいのは、
1.エンターキーもしくはマウス左クリックでWaitを抜ける
2.Waitを抜けた瞬間に上記の入力はOFFにされる(次のWaitに影響を及ぼしたくない)
の2点です。
どのような手段を用いればいいか、アプローチを教えて頂けるとうれしいです。

宜しくお願いします。

nil
記事: 428
登録日時: 12年前

Re: クリックもしくはエンターキーの入力を待つ

#2

投稿記事 by nil » 11年前

設計そのものから考え直す必要があります。
http://dixq.net/g/h_11.html
WaitKeyやメインループ内で更にProcessMessageを使うことは間違いです。

タケ

Re: クリックもしくはエンターキーの入力を待つ

#3

投稿記事 by タケ » 11年前

ご指摘ありがとうございます。

> この関数がなにをしているのか、というのは特に気にする 必要はありませんが、とにかく定期的にこの関数を呼び出して やる必要があります。
> 目安としては60分の1秒に一回程度、用はゲームのループに 一回程度です。この関数を呼び出さないと結果としてシステムが 異常に重くなったり不安定になったりします。

というのを見て、プレイヤーの入力をWaitする箇所や、1文字ずつDelayをかけて出力していく箇所には必要なのかな、と認識してしまいました。
WaitKey()自体の説明にも、この関数でWaitしている間は常にProcessMessageをかけつづけているとの記述があったので。

混乱してしまっているのですが…。
・ユーザーからの入力をWaitする際にはそのWaitループにProcessMessageは不要
・メインループ内にWaitから抜け出す記述をして、メインループを回してWaitをかけるべき
・Waitをする処理を独立して記述させようとする設計がミス
・そもそもWaitをループ回し続けてかけるのがミス
etc

すいません、考えているとどんどんハマってしまって、抜け出せそうにないです…。

タケ

Re: クリックもしくはエンターキーの入力を待つ

#4

投稿記事 by タケ » 11年前

自分なりに考えをまとめてみました。

Wait中も他の入力を受け付けなければいけないし、そもそもWaitを独自のループで行うのは間違い
メインループ内に様々な判定処理を行う関数を置く必要がある
そのメインループでのみProcessMessageを行えばよい

という感じでしょうか…?
ご指摘の通り、一度全体の設計から考え直してみます。
勉強不足でした。

nil
記事: 428
登録日時: 12年前

Re: クリックもしくはエンターキーの入力を待つ

#5

投稿記事 by nil » 11年前

>1文字ずつDelayをかけて……
どのようにしてディレイを掛けるのかにもよりますが、その場合でもSleep()やWaitTimer()を使うべきではありません。
例えば60分のn秒ずつ文字を描画したい場合は

コード:

int	        	count = 0;
std::wstring	str;
const wchar_t	buffer[] = L"てすと";
while( ProcessMessage() == 0 ){
	if( count%n == 0 ) str += buffer[ count ];
	count++;
	~描画コード~
}
こんなコードで十分です。
重要なのは処理を止める関数を使わずにカウンタを使っていることです。
ゲーム内での時間は大抵の場合カウンタを使用します。

>Wait中も他の入力を受け付けなければいけないし、そもそもWaitを独自のループで行うのは間違い
>メインループ内に様々な判定処理を行う関数を置く必要がある
>そのメインループでのみProcessMessageを行えばよい
おそらくその認識で合っていると思います。

タケ

Re: クリックもしくはエンターキーの入力を待つ

#6

投稿記事 by タケ » 11年前

なるほど、大分イメージできました。

エンターキーやクリックを待つ実装は解決できてませんが、それ以前の問題だったので(^^;
一度この質問は切り上げて、もう一度ご指摘の通り設計しなおして試行錯誤してみます。

丁寧なご回答ありがとうございました。

閉鎖

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