トップページ > 記事閲覧
文字が望んでいるタイミングに出ない
名前:サイゲン 日時: 2019/01/04 19:00

DXライブラリを用いてタイピングゲームを製作しています。 GetInputCharWaitなどで入力をする前に問題(原文表記と入力すべき文)をDrawStringで文字を描写するようにしているのですが,何度行っても真っ白な画面しか出ません。 しかし,答えを入力すると入力した問題が表示されます。 例えば,下記のソースコードの場合だと第一問目は斎藤宏介(saitou kousuke)を入力するのですが、saitou kousukeと入力したら斎藤宏介、saitou kousukeと描写されます。 どうすれば入力の際に問題文などが描写されるようになるでしょうか? #include "DxLib.h" #include <string.h> void GameMain(int *miss, int *total, int i, const char *Answer[], const char *InputAnswer[]); int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { int i = 0; int miss = 0; int total = 0; const char *Answer[5] = { "斎藤 宏介","田淵 智也","鈴木 貴雄","フライデイノベルス","パンデミックサドンデス" }; const char *InputAnswer[5] = { "saitou kousuke","tabuti tomoya","suzuki takao","huraideinoberusu","pandemikkusadondesu" }; ChangeWindowMode(TRUE); SetBackgroundColor(255, 255, 255); if(DxLib_Init() == -1) return -1; SetDrawScreen(DX_SCREEN_BACK); for (i = 0; i < 5; i++) { GameMain(&miss, &total, i, Answer, InputAnswer); } DxLib_End(); // DXライブラリ終了処理 return 0; } void GameMain(int *miss, int *total, int i, const char *Answer[], const char *InputAnswer[]) { int j, len; char Typing[2] = ""; char InputChar; int IsFirst = 0; int MainHandle, MissHandle, FontHandle; int MAIN_X, MAIN_Y, ANSWER_X, ANSWER_Y; int FONT_SIZE; int RED, LIGHTBLUE; LIGHTBLUE = GetColor(0, 255, 255); RED = GetColor(255, 0, 0); FONT_SIZE = 11; SetFontSize(20); MainHandle = LoadGraph("バズリズム.jpg"); MissHandle = LoadGraph("バズリズム.jpg"); MAIN_X = 50; MAIN_Y = 50; ANSWER_X = 50; ANSWER_Y = 50; FontHandle = CreateFontToHandle("丸ゴシック体", 20, 7, DX_FONTTYPE_NORMAL); IsFirst = 0; ClsDrawScreen(); //DrawFormatString(50, 0, GetColor(0, 0, 0), "%s",Answer[i]); DrawString(50, 0, Answer[i] , GetColor(0,0,0)); DrawString(50, 50, InputAnswer[i], GetColor(0,0,0)); len = GetStringLength(InputAnswer[i]); *total += len; for (j = 0; j < len; j++) { InputChar = GetInputCharWait(TRUE); Typing[0] = InputChar; Typing[1] = '\0'; if (Typing[0] != InputAnswer[i][j]) { (*miss)++; Typing[0] = InputAnswer[i][j]; //DrawGraph(MAIN_X, MAIN_Y, MissHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE , ANSWER_Y, Typing, RED, FontHandle); j--; } else { // 正解時の画像を表示 //DrawGraph(MAIN_X, MAIN_Y, MainHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE , ANSWER_Y, Typing, LIGHTBLUE, FontHandle); } } *total += *miss; ScreenFlip(); }
メンテ

Page: 1 |

Re: 文字が望んでいるタイミングに出ない ( No.1 )
名前:サイゲン 日時:2019/01/04 19:06

追記 開発環境 Windows 、VisualStudio 2017 です
メンテ
Re: 文字が望んでいるタイミングに出ない ( No.2 )
名前:yumetodo 日時:2019/01/04 21:59

なんとなくScreenFlip();のタイミングとかProcessMessage()を呼んでいないからキーイベントが拾えてないとかが問題なんだろうという気がする。
メンテ
Re: 文字が望んでいるタイミングに出ない ( No.4 )
名前:サイゲン 日時:2019/01/05 13:06

4K職場様 参考プロブラムありがとうございます。 早速アドバイス通り,GetInputCharWaitをGetInputCharに変更したものの勝手に文字が取得されて不正解の無限ループに陥りました・・・。 また,文字の描写もされませんでした・・・。 以下変更したプログラムです 僕はC言語しかできず,また、これは学校の課題での自由作品で、作品を学校外に公開しなければ版権のものは使用可であるということを事前に書いておきます。 #include "DxLib.h" #include <string.h> void GameMain(int *miss, int *total, int i, const char *Answer[], const char *InputAnswer[], int FontHandle, int RED, int LIGHTBLUE); int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { int FontHandle; int i = 0; int miss = 0; int total = 0; int RED, LIGHTBLUE; const char *Answer[5] = { "斎藤 宏介","田淵 智也","鈴木 貴雄","フライデイノベルス","パンデミックサドンデス" }; const char *InputAnswer[5] = { "saitou kousuke","tabuti tomoya","suzuki takao","huraideinoberusu","pandemikkusadondesu" }; ChangeWindowMode(TRUE); SetBackgroundColor(255, 255, 255); if(DxLib_Init() == -1) return -1; SetDrawScreen(DX_SCREEN_BACK); FontHandle = CreateFontToHandle(NULL, 20, 7); LIGHTBLUE = GetColor(0, 255, 255); RED = GetColor(255, 0, 0); PlaySoundFile("01 Catch up, latency.mp3", DX_PLAYTYPE_BACK); for (i = 0; i < 5; i++) { ClearDrawScreen(); GameMain(&miss, &total, i, Answer, InputAnswer, FontHandle, RED, LIGHTBLUE); ScreenFlip(); } StopMusic(); DeleteFontToHandle(FontHandle); DxLib_End(); // DXライブラリ終了処理 return 0; } void GameMain(int *miss, int *total, int i, const char *Answer[], const char *InputAnswer[], int FontHandle, int RED, int LIGHTBLUE) { int j, len; char Typing[2]; int a; int MainHandle, MissHandle; int MAIN_X, MAIN_Y, ANSWER_X, ANSWER_Y; int FONT_SIZE; FONT_SIZE = 11; SetFontSize(20); MainHandle = LoadGraph("バズリズム.jpg"); MissHandle = LoadGraph("バズリズム.jpg"); MAIN_X = 50; MAIN_Y = 50; ANSWER_X = 50; ANSWER_Y = 50; //ClearDrawScreen(); DrawFormatString(50, 0, GetColor(0, 0, 0), "%s",Answer[i]); //DrawString(50, 0, Answer[i] , GetColor(0,0,0)); DrawString(50, 50, InputAnswer[i], GetColor(0,0,0)); len = GetStringLength(InputAnswer[i]); *total += len; ClearInputCharBuf(); for (j = 0; j < len; j++) { Typing[0]= GetInputChar(TRUE); Typing[1] = '\0'; if (Typing[0] != InputAnswer[i][j]) { (*miss)++; Typing[0] = InputAnswer[i][j]; //DrawGraph(MAIN_X, MAIN_Y, MissHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE , ANSWER_Y, Typing, RED, FontHandle); j--; } else { // 正解時の画像を表示 //DrawGraph(MAIN_X, MAIN_Y, MainHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE , ANSWER_Y,Typing, LIGHTBLUE, FontHandle); } } *total += *miss; //ScreenFlip(); }
メンテ
Re: 文字が望んでいるタイミングに出ない ( No.6 )
名前:サイゲン 日時:2019/01/06 13:39

4K職場さま ご回答ありがとうございます. これを参考しにて書き直したら無事に動作しました。 しかし,制限時間を設けようと思い,GetInputCharWaitでは正確に時間が測定できないのでGetInputCharに変更するとなんと勝手にヌルコードが永遠に入力され続けるという事態が発生してこちらの入力を受け付けなくなりました・・・。 int GameMain(int MainHandle ,int i, const char *Answer[], const char *InputAnswer[]) { int j, len; char Typing[2]; int MissHandle; int OutHandle; int ANSWER_X, ANSWER_Y; int FONT_SIZE; int TimeLimit,TIMELIMIT,NowTime,CurrentTime,StartTime; int IsFirst = 0; FONT_SIZE = 11; SetFontSize(20); MissHandle = LoadGraph("えげつだね.jpg"); OutHandle = LoadGraph("煽る田淵.jpg"); ANSWER_X = 50; ANSWER_Y = 50; TimeLimit= TIMELIMIT = 10000; DrawString(50, 0, Answer[i], GetColor(0, 0, 0)); DrawString(50, 50, InputAnswer[i], GetColor(0, 0, 0)); len = GetStringLength(InputAnswer[i]); DrawExtendGraph(10, 150, 380, 400, MainHandle, TRUE); total += len; StartTime = GetNowCount(); for (j = 0; j < len; j++) { ClearInputCharBuf(); Typing[0] = GetInputChar(TRUE); Typing[1] = '\0'; if (Typing[0] != '\0' && Typing[0] >= CTRL_CODE_CMP && TimeLimit > 0) { if (Typing[0] != InputAnswer[i][j]) { if (flag) { DrawStringToHandle(50, 100, "OUT!!", RED, FontHandle); DrawExtendGraph(10, 150, 380, 400, OutHandle, TRUE); return -1; } miss++; Typing[0] = InputAnswer[i][j]; DrawExtendGraph(10, 150, 380, 400, MissHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE, ANSWER_Y, Typing, RED, FontHandle); j--; DrawStringToHandle(50, 100, "落ち着いて!!", RED, FontHandle); WaitTimer(1000); DrawBox(50, 100, 450, 150, GetColor(255, 255, 255), TRUE); DrawExtendGraph(10, 150, 380, 400, MainHandle, TRUE); } else { // 正解時の画像を表示 DrawExtendGraph(10, 150, 380, 400, MainHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE, ANSWER_Y, Typing, LIGHTBLUE, FontHandle); } } else { j--; } /*else { // 制限時間 NowTime = GetNowCount(); CurrentTime = NowTime - StartTime; TimeLimit = TIMELIMIT - CurrentTime; if (TimeLimit < 0) { DrawStringToHandle(50, 100, "OUT!!", RED, FontHandle); DrawExtendGraph(10, 150, 380, 400, OutHandle, TRUE); return -1; } }*/ } total += miss; WaitTimer(200); return 0; }
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存