MFCのゲームを作りたいのですが

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

MFCのゲームを作りたいのですが

#1

投稿記事 by natu » 17年前

タイマーのつかい方が今ひとつ分かりません。
MFCでタイピングのゲームを作成しているのですが、
25問を解き、正解だった場合もしくは制限時間を超えてしまった場合、次の問題を表示したいと思っております。
下記がプログラム内容です。
void CProgramView::Loop1(CDC* pDC)
{
CProgramDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if((m_nRight<26)|(0<m_nRight))
{
m_nRight=0; //正解数
m_nQuestion=1; //問題数
}

Haikei(pDC); //問題表示領域の枠表示
Tokei(pDC); //時計の秒針が表示される枠表示
Moji(pDC); //問題文表示
OnChar(ch, count,flags); //入力
if(m_fTimer==FALSE)
{
SetTimer(123,250,NULL); //タイマーをセット
if(m_nQuestion<26) //25問以上問題を解いていないケース
{
m_fTimer = FALSE;
}
else m_fTimer = TRUE; //全問解いた場合
}
Loop0(pDC); //秒針の描画クラス
if(m_nx==715) //タイムアウトだった場合
{
KillTimer(123);
NGPaper(pDC);
m_nQuestion++; //問題をカウント
m_sAnser.Empty(); //回答文字列をクリア
pDoc->GetNextSet(); //次の問題を取得する
InvalidateRect(NULL);
}
if(m_nQuestion<m_nCount) //正解だった場合
{
KillTimer(123); //タイマーを切る
Tokei(pDC); //秒針の画像を消すために時計の画面を再描画
Right(pDC); //正解した場合の画像を描画
Haikei(pDC); //問題文・回答を消すために問題表示領域の枠を再描画
PartsPaper1(pDC); //正解した場合の壁紙を表示
m_nQuestion++; //問題数をカウント
m_sAnser.Empty(); //回答文字列をクリアする
pDoc->GetNextSet(); //次の問題を取得する
InvalidateRect(NULL);
}
}
そして、この動作を25問、解くまでループさせる関数として以下の関数を作成しました。
void CProgramView::Loop2(CDC* pDC)
{
if(m_fTimer==FALSE)
{
Loop1(pDC);
}
}
//タイマーの内容
void CProgramView::OnTimer(UINT nIDEvent)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
if(nIDEvent == 123)
{
InvalidateRect(NULL);
}
CView::OnTimer(nIDEvent);
}
しかし、実際にこのプログラムを実行すると入力し、正解する間は次の問題が表示されるのですが、タイマーが切れません。
そして、制限時間になるとそこまで解いていた問題から凄い勢いで描画が始まり、止まりません。
おそらくタイマーが正常に使えていないという可能性が考えられるのですが・・・。

希望としては、25問を順次解き、解き終わった後は画像を描画し、次の問題を表示したいのですが、どうしたら良いか教えてください。

この疑問に関して、メッセージポンプで対応すれば良いということを某掲示板で教えていただいたのですが、具体的な使用方法が分からず困惑しております。よろしければおしえていただければと思います。

バグ

Re:MFCのゲームを作りたいのですが

#2

投稿記事 by バグ » 17年前

OnTimer関数の中身も見せてください。

バグ

Re:MFCのゲームを作りたいのですが

#3

投稿記事 by バグ » 17年前

すみません、ちゃんと掲載されてましたね…(^_^;)
失礼しました。

バグ

Re:MFCのゲームを作りたいのですが

#4

投稿記事 by バグ » 17年前

正解だった場合にしか、タイマーの解除と再描画をしていない気がするんですが、その辺りは関係ありませんか?

ま~く

Re:MFCのゲームを作りたいのですが

#5

投稿記事 by ま~く » 17年前

パッと見なのですが・・Timerの部分というより、MFCを使ったプログラムの流れが出来ていないような気がします。

void CProgramView::Loop1(CDC* pDC) メソッドは 何所から呼ばれていますか?
CDC *pDCを貰っている所をみると、OnDrawから呼んでいませんか?

もしそうであれば、以下の点に注意した方が良いと思います。
・OnDraw内(そこから呼ばれるメソッド等)では、InvalidateRectは呼ばない。
すごい勢いで描画されるのはこのせい?
・OnDrawでは「通常」描画だけをすべき。

>この疑問に関して、メッセージポンプで対応すれば良いということを某掲示板で教えていただいたのですが、具体的な使用方法が分からず困惑しております。よろしければおしえていただければと思います。

う~ん?MFCを使っているんですよね?であれば、「メッセージポンプを使う」というのはあまり・・・

とりあえず、CViewから派生してできたView内でなんとかなりますよ。

以下適当ですが、流れを・・

OnCreate等 初期化: SetTimer で 1秒周期とかにする。
第一問目の状態にする。
リミット時刻リセット。

OnDraw: その時の状態を描画する

OnChar: 回答(キーボードで入力ですよね?番号とか・・) されたら判定して
次の問題に移すとかの制御。
そして Invalidate

OnTimer: 一秒周期とかでくるので、リミットの時刻になるまで、カウンタか何かをインクリメント
カウンタがリミットの時間分を過ぎたら 次の問題に移すとかの制御
そして Invalidate

閉鎖

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