トップページ > 記事閲覧
他の動作とカウントダウン動作を同時に行いたい
名前:砂糖 日時: 2016/05/15 04:43

現在、タイピングゲームを製作しているのですが、メイン動作の部分で 入力受け付け、正誤判定、出力などの動作を行いながら 制限時間のカウントダウン出力を同時に行う方法ってありますか? GetNowCount()関数を用いれば確かに現在の時間を取得することができますが、 別の処理を行っている場合、1秒ごとにカウントダウン出力をしようとしても別の処理が終わらない限りそれが出力されません。 どうにかして別の処理と並行してカウントダウン出力を行いたいのです。 他の動作とカウントダウン動作を同時に行う手段がないか調べてみたのですが、 私の疑問を解決してくれるサイトは見つかりませんでした。 分かる方、ご教授願います。 参考としてメイン動作部分のプログラムの一部を掲載しておきます。 // 問題数の数だけ反復 while (i < QuestionNum) { char Kana[BUF]; // 問題文を格納 char Alpha[BUF]; // 答えとなるローマ字列を格納 char InputChar; // 入力の格納 ClearDrawScreen(); DrawGraph(MAIN_X, MAIN_Y, MainHandle, TRUE); //DrawGraph(TIMEBAR_X, TIMEBAR_Y, BarHandle, TRUE); RondomRead = rand() % QuestionNum; // ファイルから読み込んだデータを格納 // ランダムの行数だけ読み込むことで疑似的にランダムに出題 for (RondomQuestion = 0; RondomQuestion <= RondomRead; RondomQuestion++) { FileRead_gets(Kana, BUF, QFileHandle); FileRead_gets(Alpha, BUF, AFileHandle); } DrawStringToHandle(QUESTION_X, QUESTION_Y, Kana, BLACK, FontHandle); DrawStringToHandle(ANSWER_X, ANSWER_Y, Alpha, BLACK, FontHandle); AlphaLen = strlen(Alpha); StartTime = GetNowCount(); // 入力と正誤判定 for (j = 0; j < AlphaLen; j++) { InputChar = GetInputCharWait(TRUE); Typing[0] = InputChar; // 正誤判定 if (Typing[0] != Alpha[j]) { // 1回目のGetInputCharWait関数より先に1回目の正誤判定が行われるため // IsFirstで1回目の正誤判定を飛ばす if (IsFirst == 0) { j--; IsFirst = 1; continue; } // ミス時の画像を表示 Typing[0] = Alpha[j]; DrawGraph(MAIN_X, MAIN_Y, MissHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE / 2, ANSWER_Y, Typing, RED, FontHandle); MissTypeCount++; j--; } else { // 正解時の画像を表示 DrawGraph(MAIN_X, MAIN_Y, MainHandle, TRUE); DrawStringToHandle(ANSWER_X + j * FONT_SIZE / 2, ANSWER_Y, Typing, LIGHTBLUE, FontHandle); TypeCount++; } } EndTime = GetNowCount(); TotalTime += EndTime - StartTime; DrawGraph(MAIN_X, MAIN_Y, SuccessHandle, TRUE); DrawFormatStringToHandle(400, 350, BLACK, FontHandle, "%d", TotalTime); WaitTimer(WAIT_TIME); // ここでもう一度開くことにより終端の判定をさせない QFileHandle = FileRead_open("Question.dat"); AFileHandle = FileRead_open("Answer.dat"); i++; }
メンテ

Page: 1 |

Re: 他の動作とカウントダウン動作を同時に行いたい ( No.1 )
名前:Nameless 日時:2016/05/15 10:35

GetInputCharWaitで入力を待っている間処理が止まっているのを何とかしましょう。 まず、GetInputCharを使えば入力を待たないのでこちらを使いましょう。 入力を待たなければ、その間に出力を行うことができます。 単純にGetInputCharWaitをGetInputCharに置き換えた時に発生する問題は4つあります。 1. InputChar が入力された文字ではなく0かもしれない 2. 「for (j = 0; j < AlphaLen; j++)」のループ回数が入力された文字と一致しない 3. 「for (j = 0; j < AlphaLen; j++)」のループ中にProcessMessageが呼ばれない 4. 「for (j = 0; j < AlphaLen; j++)」のループ中を常に実行し続ける為、CPUに負荷をかける 1の問題に関しては、InputChar の戻り値をチェックして入力されたときだけ正誤判定をするというようにすれば良いでしょう。 (ついでにGetInputCharのサンプルのように、操作コードのチェックもしても良いと思います) 2の問題に関しては、j--;でも良いです。 3の問題に関しては、ProcessMessageを呼べば良いです。(「while (i < QuestionNum)」の方でも呼んだ方が良いかと思います) 4の問題に関しては、WaitTimerをループの最初に入れれば良いと思います ただ、他にも気になることがあります。 ・rand関数は乱数の精度が悪いことで有名です。せっかくなのでDXライブラリのGetRand関数を使ってみては。 ・問題を1つ出すごとにいちいち読み込んでは捨てていますが、「while (i < QuestionNum)」のループに入る前に一度全部読み込んで、  RondomReadの行数目の問題を出すにしたほうが平均では無駄が少ないと思います。 ・↑をやらないにしても、「もう一度開く」前に一度閉じてください。閉じずに開き続けると最終的にはファイルが開けなくなってしまいます。 ・裏画面を使ってないのは意図的でしょうか。 うーん。とりあえずはこんなところでしょうか。
メンテ
Re: 他の動作とカウントダウン動作を同時に行いたい ( No.2 )
名前:砂糖 日時:2016/05/15 14:19

詳しい解説ありがとうございます。 1から4の問題は無事解決することができました。 rand関数とファイルクローズしていない問題も修正しました。 裏画面については現在修正中です。 もう一度開く前にファイルを閉じるように修正したのですが、 一旦ファイルを全て読み込み、RondomRead行目を出力するにはどうやって実現すればよいのでしょうか? 本来の質問の意図とは少し離れますが、ご教授願います。
メンテ
Re: 他の動作とカウントダウン動作を同時に行いたい ( No.3 )
名前:Nameless 日時:2016/05/15 16:10

こんな感じでしょうか。 ------------------------------------------------------ const int QuestionNum_MAX = ファイルの最大行数; //while文の前に //ファイルから読み込む //i + 1行目の問題文はKana_all[i] //i + 1行目の答えはAlpha_all[i] //例えば一行目の問題文はKana[0]になります char Kana_all [QuestionNum_MAX][BUF]; // 問題文を格納 char Alpha_all[QuestionNum_MAX][BUF]; // 答えとなるローマ字列を格納 // ファイルから読み込んだデータを格納 QFileHandle = FileRead_open("Question.dat"); AFileHandle = FileRead_open("Answer.dat"); for (int i = 0; i < QuestionNum; i++) { FileRead_gets(Kana_all[i], BUF, QFileHandle); FileRead_gets(Alpha_all[i], BUF, AFileHandle); } FileRead_close(QFileHandle); FileRead_close(AFileHandle); // 問題数の数だけ反復 while (i < QuestionNum) { const char* Kana; const char* Alpha; //略 //RondomRead番目の問題を出す Kana = Kana_all[RondomRead]; Alpha = Alpha_all[RondomRead]; //以下略 ------------------------------------------------------
メンテ
Re: 他の動作とカウントダウン動作を同時に行いたい ( No.4 )
名前:砂糖 日時:2016/05/15 17:10

なるほど、ありがとうございます!! カウントダウンの実装もできそうです。 助かりました!!
メンテ

Page: 1 |

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

   クッキー保存