DXライブラリのタイピングゲームで入力を待ってほしくない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Watasuke
記事: 10
登録日時: 2週間前
連絡を取る:

DXライブラリのタイピングゲームで入力を待ってほしくない

#1

投稿記事 by Watasuke » 1週間前

現在、DXライブラリでタイピングゲームを製作中です。

コード:

char in;
char typ[STR_MAX] = "";
char ans[QUIZ_MAX][STR_MAX] ={
	"kouennniikimasita",
	"anatahasuzukisandesuka",
	"kyouhamokuyoubinanodarouka"
};
int  pos = 0;
int NowQuiz=0;

void GetKey(){
	ClearInputCharBuf();
	in = GetInputCharWait(TRUE);
	//入力があれば
	if( in >= CTRL_CODE_CMP ){
		//同じであれば
		if(in == ans[NowQuiz][pos]){
			typ[pos] = in;
			pos++;
		}
	}
	if(ans[NowQuiz][pos] == '\0'){
		NowQuiz++;
		pos=0;
		for(int i=0; i < STR_MAX; i++)
			typ[i]=0;
		if(NowQuiz >= QUIZ_MAX) NowQuiz=0;
	}
}

void Draw(){
	ShapeRotation();
	DrawFormatStringToHandle(
	WINDOW_X/2 - GetDrawFormatStringWidthToHandle(MainFont,"%s",ans[NowQuiz])/2,
	WINDOW_Y/2,White,MainFont,"%s",ans[NowQuiz]);
	DrawFormatStringToHandle(
	WINDOW_X/2 - GetDrawFormatStringWidthToHandle(MainFont,"%s",typ)/2,
	WINDOW_Y/2+80,White,MainFont,"%s",typ);
}

void Typing(){
	GetKey();
	Draw();
}
見づらいかとは思いますが、タイピング部分の一部はこのようなコードになっています。

ところで、このプログラムには少し問題があります。
Draw()関数内のShapeRotation()関数は画像を回転させながら下に移動させ、画面外に出たら図形を消すという演出用の関数となっています。
ですが、GetInputCharWait()の関数のせいで、毎フレーム呼ぶことができず、カクカクと移動してしまいます。
また、制限時間などを設けるのが難しいように思います(まだ作っていませんが)。

そこで、GetInputCharWaitのところをGetInputCharとしたいのですが、そのまま変えると文字を入力しても反応がありませんでした。

どうすればこれを解決できますか?

急いで書いたので補足などがあれば返信します

アバター
みけCAT
記事: 6065
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: DXライブラリのタイピングゲームで入力を待ってほしくない

#2

投稿記事 by みけCAT » 1週間前

入力を読み込む前にClearInputCharBuf()を呼んでいるため、キー入力のデータが消されてしまい、
入力を検出できなくなっているようです。
従って、この関数の呼び出しを削除するといいと思います。

動作確認したコード (DXライブラリ Ver3.17a)

コード:

#include <DxLib.h>
#define STR_MAX 1024
#define QUIZ_MAX 1024
#define STR_MAX 1024
#define WINDOW_X 640
#define WINDOW_Y 480
int MainFont;
int White;
void ShapeRotation() {
	static unsigned int t = 0;
	DrawFormatString(10, 10, GetColor(0, 255, 0), "%u", t++);
}

char in;
char typ[STR_MAX] = "";
char ans[QUIZ_MAX][STR_MAX] ={
	"kouennniikimasita",
	"anatahasuzukisandesuka",
	"kyouhamokuyoubinanodarouka"
};
int  pos = 0;
int NowQuiz=0;

void GetKey(){
	//ClearInputCharBuf();
	//in = GetInputCharWait(TRUE);
	in = GetInputChar(TRUE);
	//入力があれば
	if( in >= CTRL_CODE_CMP ){
		//同じであれば
		if(in == ans[NowQuiz][pos]){
			typ[pos] = in;
			pos++;
		}
	}
	if(ans[NowQuiz][pos] == '\0'){
		NowQuiz++;
		pos=0;
		for(int i=0; i < STR_MAX; i++)
			typ[i]=0;
		if(NowQuiz >= QUIZ_MAX) NowQuiz=0;
	}
}

void Draw(){
	ShapeRotation();
	DrawFormatStringToHandle(
	WINDOW_X/2 - GetDrawFormatStringWidthToHandle(MainFont,"%s",ans[NowQuiz])/2,
	WINDOW_Y/2,White,MainFont,"%s",ans[NowQuiz]);
	DrawFormatStringToHandle(
	WINDOW_X/2 - GetDrawFormatStringWidthToHandle(MainFont,"%s",typ)/2,
	WINDOW_Y/2+80,White,MainFont,"%s",typ);
}

void Typing(){
	GetKey();
	Draw();
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() != 0) return -1;
	MainFont = CreateFontToHandle(NULL, -1, -1, -1);
	White = GetColor(255, 255, 255);
	SetDrawScreen(DX_SCREEN_BACK);

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		Typing();
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Watasuke
記事: 10
登録日時: 2週間前
連絡を取る:

Re: DXライブラリのタイピングゲームで入力を待ってほしくない

#3

投稿記事 by Watasuke » 1週間前

おお・・・ちゃんと動いてくれました!ありがとうございます!

ClearInputCharBuf()は要らなかったのですね・・・勉強になりました。
また質問があればその時はよろしくお願いします!

返信

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