プロが教えるわが家の防犯対策術!

いつもお世話になっています。
いま、タイマーを使ったアニメーションをやっているのですが、
SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);
ようにすると、下のID_MOJIOKURIの部分しか処理されません。
case WM_TIMER:
switch(wParam){
case ID_YOKOUGOKI:
if(syouninkaiwa<13){
if(playeryoko==1){
playeryoko=2;
}else if(playeryoko==2){
playeryoko=3;
}else if(playeryoko==3){
playeryoko=4;
}else if(playeryoko==4){
playeryoko=1;
}
if(syouninyoko==1){
syouninyoko=2;
}else if(syouninyoko==2){
syouninyoko=3;
}else if(syouninyoko==3){
syouninyoko=4;
}else if(syouninyoko==4){
syouninyoko=1;
}
}
break;
case ID_MOJIOKURI:
if(syouninkaiwa==1){
mojiokuri+=1;
}
break;
}
InvalidateRect(VisualWnd,NULL,FALSE);
return 0;


また描画処理は
if(playeryoko==1){
BitBlt(hdcv, 250,132, 34, 32,
memdc[50], 0, 0, SRCCOPY);
}else if(playeryoko==2){
BitBlt(hdcv, 249,130, 34, 32,
memdc[55], 0, 0, SRCCOPY);
}else if(playeryoko==3){
BitBlt(hdcv, 250,132, 34, 32,
memdc[50], 0, 0, SRCCOPY);
}else if(playeryoko==4){
BitBlt(hdcv, 249,130, 34, 32,
memdc[56], 0, 0, SRCCOPY);
}
if(syouninyoko==1){
BitBlt(hdcv, 220,130, 29, 32,
memdc[51], 0, 0, SRCCOPY);
}else if(syouninyoko==2){
BitBlt(hdcv, 220,130, 29, 32,
memdc[57], 0, 0, SRCCOPY);
}else if(syouninyoko==3){
BitBlt(hdcv, 220,130, 29, 32,
memdc[51], 0, 0, SRCCOPY);
}else if(syouninyoko==4){
BitBlt(hdcv, 220,130, 29, 32,
memdc[58], 0, 0, SRCCOPY);
}
}else{
BitBlt(hdcv, 250,130, 34, 32,
memdc[50], 0, 0, SRCCOPY);
BitBlt(hdcv, 220,130, 29, 32,
memdc[51], 0, 0, SRCCOPY);
}
SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);

if(syouninkaiwa == 0){
TextOut(hdcv,350,350,TEXT("push Enter"),lstrlen(TEXT("push Enter")));
}else if(syouninkaiwa == 1){
if(mojiokuri==1){
wsprintf(TEXT1,L"○");
}else if(mojiokuri==2){
wsprintf(TEXT1,L"○○");
}else if(mojiokuri==3){
wsprintf(TEXT1,L"○○○");
}else if(mojiokuri==4){
wsprintf(TEXT1,L"○○○○");
}else if(mojiokuri==5){
wsprintf(TEXT1,L"○○○○○");
}else if(mojiokuri==6){
wsprintf(TEXT1,L"○○○○○○");
}else if(mojiokuri==7){
wsprintf(TEXT1,L"○○○○○○○");
}else if(mojiokuri==8){
wsprintf(TEXT1,L"近頃、冒険者が多");
}
・・・・・・・・・・・・・・・・・・・・
TextOut(hdcv,20,240,TEXT1,lstrlen(TEXT1));
 
というふうです。
どちらが悪いのか分かりません。
ちなみに、タイマーの時間を同じにしたら、同時にできましたが、両方の処理が遅くなりました。
 
どのように解決したらよいのか教えてください。お願いします。

A 回答 (1件)

コードから推察するに、原因は描画コード内のSetTimer関数の呼び出しだと思われます。



> SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
> SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);

まず、SetTimer関数(およびメッセージタイマー全体)の仕様を確認してください。
MSDN - SetTimer関数
http://msdn.microsoft.com/ja-jp/library/cc411200 …

SetTimer関数を呼び出すとuElapse引数で与えられた間隔で、WM_TIMERイベントを送り続ける仕様です。
nIDEventで識別されるタイマーが既に設定されていた場合、タイマーはリセットされます。

描画コードがWM_PAINTメッセージで処理されると仮定すると、
WM_TIMER→InavlidateRect()→WM_PAINT送出→SetTimer()が呼び出され、どちらのタイマもリセットされる。
ID_MOJIOKURIのタイマの方がID_YOKOUGOKIより高頻度なため、
高確率でID_MOJIOKURIが処理されているように見える…のではないかと思います。
提示されたコードからの推測ですので、確証はありませんが。

コードを見る限り、描画コード中のSetTimer関数呼び出しは不要に思えます。
ひとまず、描画コード中のSetTimer関数呼び出しは削除し、
タイマが不要になったらKillTimer関数を呼び出すように変更してみてはいかがでしょうか。


また、蛇足ですがメッセージタイマは55ms程度の精度しかありません。
ID_MOJIOKURIで20msを指定されていますが、実際にはその間隔での処理は期待できません。
文字送りですので、特に問題ないと思いますけど。
    • good
    • 1
この回答へのお礼

回答ありがとうございました。
SetTimerをWM_CREATEでやったらできました。
詳しいご説明、本当にありがとうございました。

お礼日時:2011/09/03 11:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています