いつもお世話になっています。
いま、タイマーを使ったアニメーションをやっているのですが、
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));
というふうです。
どちらが悪いのか分かりません。
ちなみに、タイマーの時間を同じにしたら、同時にできましたが、両方の処理が遅くなりました。
どのように解決したらよいのか教えてください。お願いします。
No.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を指定されていますが、実際にはその間隔での処理は期待できません。
文字送りですので、特に問題ないと思いますけど。
回答ありがとうございました。
SetTimerをWM_CREATEでやったらできました。
詳しいご説明、本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript jsで、配列内の文章を改行する際どのようにすればいいですか。 3 2022/07/05 20:40
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CWnd::OnTimerのスレッドの取得
C言語・C++・C#
-
-
4
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
5
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
6
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
7
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
8
TimerProc コールバック関数を利用する方法
C言語・C++・C#
-
9
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
10
C#にて別クラスの関数を使いたい
C言語・C++・C#
-
11
SetTimer関数について。
C言語・C++・C#
-
12
メッセージハンドラ
C言語・C++・C#
-
13
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
14
error RC2104について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ListBoxで改行したい
-
C#を用いて描画する四角形の角...
-
for文の実行速度を遅くしたいの...
-
Word:描画オブジェクト内の画...
-
花火のアルゴリズム
-
C# DrawImage 物理サイズでな...
-
scilabでのグラフ描画時の軸設定
-
フォームに描画して表示をスク...
-
給紙トレイをダイアログを使わ...
-
色を合成するには
-
VC++2010 で線形の描画について...
-
Excel VBA:コントロールボタン...
-
DrawLine
-
delphi 画面のちらつき
-
ユーザーフォームを表示中にシ...
-
エクセル・VBA CheckBoxのオブ...
-
VBA(エクセル)で自動的にボタン...
-
エクセルエラー13型が一致しま...
-
VBA シートのボタン名を変更し...
-
実行時エラー 438になった時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ListBoxで改行したい
-
for文の実行速度を遅くしたいの...
-
PowerPoint の VBA
-
C#を用いて描画する四角形の角...
-
給紙トレイをダイアログを使わ...
-
win32api複数のタイマーを同時...
-
Word 描画オブジェクトを削除...
-
ビットマップに描画をしてピク...
-
VC;;6.0のMFCで線を簡単に引け...
-
VB.NETでグラフィックを描くと...
-
C# DrawImage 物理サイズでな...
-
MFCでのコンボボックスについて
-
Excel VBA:コントロールボタン...
-
ボタンの更新速度について
-
画面に絵を出す方法
-
N88BASICでシューティングゲー...
-
MySQLのデータをグラフ化して表...
-
C#でPictureBox内での図形移動...
-
エクセルのレーダーチャート 0...
-
円の頂点の求め方を知りたいです。
おすすめ情報