タイマーのつかい方が今ひとつ分かりません。
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問を順次解き、解き終わった後は画像を描画し、次の問題を表示したいのですが、どうしたら良いか教えてください。
この疑問に関して、メッセージポンプで対応すれば良いということを某掲示板で教えていただいたのですが、具体的な使用方法が分からず困惑しております。よろしければおしえていただければと思います。
MFCのゲームを作りたいのですが
Re:MFCのゲームを作りたいのですが
パッと見なのですが・・Timerの部分というより、MFCを使ったプログラムの流れが出来ていないような気がします。
void CProgramView::Loop1(CDC* pDC) メソッドは 何所から呼ばれていますか?
CDC *pDCを貰っている所をみると、OnDrawから呼んでいませんか?
もしそうであれば、以下の点に注意した方が良いと思います。
・OnDraw内(そこから呼ばれるメソッド等)では、InvalidateRectは呼ばない。
すごい勢いで描画されるのはこのせい?
・OnDrawでは「通常」描画だけをすべき。
>この疑問に関して、メッセージポンプで対応すれば良いということを某掲示板で教えていただいたのですが、具体的な使用方法が分からず困惑しております。よろしければおしえていただければと思います。
う~ん?MFCを使っているんですよね?であれば、「メッセージポンプを使う」というのはあまり・・・
とりあえず、CViewから派生してできたView内でなんとかなりますよ。
以下適当ですが、流れを・・
OnCreate等 初期化: SetTimer で 1秒周期とかにする。
第一問目の状態にする。
リミット時刻リセット。
OnDraw: その時の状態を描画する
OnChar: 回答(キーボードで入力ですよね?番号とか・・) されたら判定して
次の問題に移すとかの制御。
そして Invalidate
OnTimer: 一秒周期とかでくるので、リミットの時刻になるまで、カウンタか何かをインクリメント
カウンタがリミットの時間分を過ぎたら 次の問題に移すとかの制御
そして Invalidate
void CProgramView::Loop1(CDC* pDC) メソッドは 何所から呼ばれていますか?
CDC *pDCを貰っている所をみると、OnDrawから呼んでいませんか?
もしそうであれば、以下の点に注意した方が良いと思います。
・OnDraw内(そこから呼ばれるメソッド等)では、InvalidateRectは呼ばない。
すごい勢いで描画されるのはこのせい?
・OnDrawでは「通常」描画だけをすべき。
>この疑問に関して、メッセージポンプで対応すれば良いということを某掲示板で教えていただいたのですが、具体的な使用方法が分からず困惑しております。よろしければおしえていただければと思います。
う~ん?MFCを使っているんですよね?であれば、「メッセージポンプを使う」というのはあまり・・・
とりあえず、CViewから派生してできたView内でなんとかなりますよ。
以下適当ですが、流れを・・
OnCreate等 初期化: SetTimer で 1秒周期とかにする。
第一問目の状態にする。
リミット時刻リセット。
OnDraw: その時の状態を描画する
OnChar: 回答(キーボードで入力ですよね?番号とか・・) されたら判定して
次の問題に移すとかの制御。
そして Invalidate
OnTimer: 一秒周期とかでくるので、リミットの時刻になるまで、カウンタか何かをインクリメント
カウンタがリミットの時間分を過ぎたら 次の問題に移すとかの制御
そして Invalidate