初めて投稿させていただきます。
当方、C言語の勉強を始めて1ヶ月の素人です。
いろんなサイトを参考にしつつ、簡単なタイピングのプログラムを組んでいるのですが、画面がまっくらになり、何も表示されなくなってしまいました。
いろいろいじってみたところ、裏画面設定のSetDrawScreen(DX_SCREEN_BACK)を付けると画面が真っ黒になるようなのです。
裏画面処理をおこなった状態で表示するのにどこが間違っているのでしょうか?
素人ゆえ、基本的なミスなのかもしれませんがご教授願えませんでしょうか?
[code]
#include"DxLib.h"
#include<string>
#include<time.h>
#include<stdlib.h>
#define NUM_Q 4
int Cr;
void Judge(char Seikai[], int n) {
static int i = 0;
static char Nyuryoku;
static char Nyuryoku_end[30];
Nyuryoku = GetInputChar(TRUE);//文字入力バッファから一文字取得
if (Nyuryoku != 0 && Nyuryoku >= CTRL_CODE_CMP) {
Nyuryoku_end[i] = Nyuryoku;
if (Seikai[i] == Nyuryoku) {
i++;
}
else {
DrawFormatString(240 + 20 * i, 260, GetColor(250, 0, 0), "×");
}
Nyuryoku_end[i] = '\0';
DrawFormatString(240, 300, Cr, Nyuryoku_end);
if (i == n) {
i = 0;
DrawFormatString(640/2-40, 200, Cr, "正解です");
return;
}
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE), DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
while(ScreenCopy() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
srand((unsigned int)time(NULL));
char *Seikai[] = {
"haro-","dadanmaku","ganbare","kansei"
};
SetFontSize(20);
Cr = GetColor(255, 255, 255);
int StrWidth_Q, StrLen_Q, StrWidth_S, StrLen_S;
DrawFormatString(640 / 2 - 130, 240 - 32, Cr, "キーを押すとスタートします");
int j;
j = rand() % NUM_Q;
StrLen_Q = strlen("ハロー");
StrWidth_Q = GetDrawStringWidth("ハロー", StrLen_Q);
StrLen_S = strlen(Seikai[j]);
StrWidth_S = GetDrawStringWidth(Seikai[j], StrLen_S);
WaitKey();
ClearDrawScreen();
ClearInputCharBuf();
DrawFormatString(640 / 2 - StrWidth_Q / 2, 30, Cr, "ハロー");
DrawFormatString(640 / 2 - StrWidth_S / 2, 50, Cr, Seikai[j]);
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
Judge(Seikai[j], StrLen_S);
}
WaitKey();
DxLib_End();
return 0;
}
}
[/code]
よろしくお願いします。
画面表示されなくなった・・・
Re: 画面表示されなくなった・・・
なるほど、まず外側のwhileループはダミーで、ブロックが実行されるとreturn 0;して終了するのですね。
それをふまえた上で、本物のメインループではCheckHitKey関数とJudge関数しか呼ばれておらず、裏画面に描画した内容を表画面に反映させる処理がありません。
従って、裏画面処理を有効にすると真っ黒になるのでしょう。
ダミーのループがあるのはおかしいので、設計を見直しましょう。
WaitKeyの利用も避け、状態を変数で管理するといいでしょう。
それをふまえた上で、本物のメインループではCheckHitKey関数とJudge関数しか呼ばれておらず、裏画面に描画した内容を表画面に反映させる処理がありません。
従って、裏画面処理を有効にすると真っ黒になるのでしょう。
ダミーのループがあるのはおかしいので、設計を見直しましょう。
WaitKeyの利用も避け、状態を変数で管理するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 画面表示されなくなった・・・
ご回答いただきありがとうございます。
いろんなサイトを参考にしつつ、部分的に変更を繰り返すうちにこのようなプログラムになってしまいました。
もう一度、自分で設計を見直して再度プログラムを組んでみようと思います。
おこがましいのですがひとつだけ質問をさせてください。
素人まるだしで申し訳ないですがご回答いただけると幸いです。
いろんなサイトを参考にしつつ、部分的に変更を繰り返すうちにこのようなプログラムになってしまいました。
もう一度、自分で設計を見直して再度プログラムを組んでみようと思います。
おこがましいのですがひとつだけ質問をさせてください。
状態を変数で管理とは、フラグ等を使って状態を管理するという考えでよろしかったでしょうか?みけCAT さんが書きました: WaitKeyの利用も避け、状態を変数で管理するといいでしょう。
素人まるだしで申し訳ないですがご回答いただけると幸いです。
Re: 画面表示されなくなった・・・
設計を見直して、while文を一つにし、初期表示の場面と入力、判定の場面を分割してWaitKeyを使わずプログラムを組み直したことで画面を表示することが出来ました。
しかし、まだ私の理解が足りないせいで、残念ながら別の問題が出てきてしまいました。
今回の画面表示がされなくなった、という問題に関しては解決したと判断し、今回はこれで解決としたいと思います。
別に出てきた問題は別のトピックで質問しなおそうと思っています。
今回は閲覧、回答ありがとうございました。
しかし、まだ私の理解が足りないせいで、残念ながら別の問題が出てきてしまいました。
今回の画面表示がされなくなった、という問題に関しては解決したと判断し、今回はこれで解決としたいと思います。
別に出てきた問題は別のトピックで質問しなおそうと思っています。
今回は閲覧、回答ありがとうございました。