
win32api
ビットマップを描画したとき、タイマーで少しずつ動かしているのですが、
画面がかなりちらつきます。
調べても、イマイチわからなくてどうすればいいかわかりません。
是非、わかりやすく教えていただきたいです。
タイマーの中身です。
ugokuはタイマーがあるかないかを判断するためにいれました。
なかなかいい方法が見つからなかったので。
playermukiはそのままです。
case WM_TIMER:
ugoku=1;
if(playermuki==1){
playerX-=3;
InvalidateRect(VisualWnd,NULL,TRUE);
}else if(playermuki==2){
playerX+=3;
InvalidateRect(VisualWnd,NULL,TRUE);
}else if(playermuki==3){
playerY+=3;
InvalidateRect(VisualWnd,NULL,TRUE);
}else if(playermuki==4){
playerY-=3;
InvalidateRect(VisualWnd,NULL,TRUE);
}
break;
また、タイマーをセットするとき
case WM_KEYDOWN:
if(wParam==VK_RIGHT){
playermuki=1;
if(ugoku==0){
SetTimer(VisualWnd,ID_T_UGOKI,50,NULL);
}
}else if(wParam==VK_LEFT){
playermuki=2;
if(ugoku==0){
SetTimer(VisualWnd,ID_T_UGOKI,50,NULL);
}
}else if(wParam==VK_UP){
playermuki=3;
if(ugoku==0){
SetTimer(VisualWnd,ID_T_UGOKI,50,NULL);
}
}else if(wParam==VK_DOWN){
playermuki=4;
if(ugoku==0){
SetTimer(VisualWnd,ID_T_UGOKI,50,NULL);
}
}
return 0;
タイマーを切るとき
case WM_KEYUP:
if(wParam==VK_RIGHT){
KillTimer(VisualWnd,ID_T_UGOKI);
ugoku=0;
}else if(wParam==VK_LEFT){
KillTimer(VisualWnd,ID_T_UGOKI);
ugoku=0;
}else if(wParam==VK_UP){
KillTimer(VisualWnd,ID_T_UGOKI);
ugoku=0;
}else if(wParam==VK_DOWN){
KillTimer(VisualWnd,ID_T_UGOKI);
ugoku=0;
}
return 0;
No.2ベストアンサー
- 回答日時:
ちらつきが発生する原因は主に2種類です。
一つは、GetDC()で取得したデバイスコンテキストに直接描画している場合で、描画過程が見えているために発生するちらつきです。
これはダブルバッファリングという方法を使えば解決できます。
画面構築用のビットマップ(バックバッファやオフスクリーンバッファと呼ばれます)を確保してそこに描画し、完成した画面をウィンドウに一気に描画します。
ダブルバッファリングはググれば解説が沢山見つかります。
もう一つはティアリングと呼ばれるものです。
これは文字で説明するより実際に見てもらった方がわかりやすいと思うので参考URLを参照してください。
http://d4.princess.ne.jp/multimedia/ntsc/tearing …
スクロール等で特に目立ちます。
ティアリングによるちらつきはGDIでは解決できません。
DirectXを使って垂直同期を取る必要があります。
この回答への補足
回答ありがとうございます。
ダブルバッファリング、調べてみましたが、よくわかりません。(すいません
できれば、わかりやすく教えていただきたいのですが・・・
No.1
- 回答日時:
InvalidateRectの第3引数にTRUEを指定した場合の意味はご存知?
意味は「矩形領域が無効になったから、一旦、ウィンドゥの背景色を描画してね」です。
つまり「一旦、ウィンドゥの背景色を描画してから、ビットマップを描画してね」って事。
動作は
ウィンドゥの背景色を描画
↓
ビットマップを描画
↓
ウィンドゥの背景色を描画
↓
ビットマップを描画
↓
の繰り返しになるから、チラつくのは当たり前。つか、プログラムで「チラつかせろ」ってやってるに等しい。
チラつきを抑えるなら
・InvalidateRectの第3引数にFALSEを指定し、動く前のビットマップが消えずに残るから、動く前の場所だけ自前で消す
・InvalidateRectを一切使わず、ウィンドゥ全体を自前で再描画し、ウィンドゥの背景ブラシをNULL_BRUSHにしておく
などの方法を取りましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
【VC++】コントロールの上に描画
-
VBAにGDI+を参照させる方法
-
[VB.net] DataGridViewの列ヘッ...
-
ウインドウサイズを変更しても...
-
GetGlyphOutline() ご利用経験...
-
c言語を使いダイアログにbmpを...
-
楕円を描くプログラミング
-
VB6,リストボックスの特定行の...
-
C# ラバーバンドの描画を快適に...
-
C言語(dxlib)のDrawboxについ...
-
3Dシミュレータの開発言語
-
デュアルディスプレイ下におい...
-
Spreadで表全体を選択した場合...
-
リストビューでのドラッグ&ド...
-
クライアント領域のコントロー...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
エクセルで作った新しいウイン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報