Win32APIを用いたソフト中で、主人公がマップ中を移動した際のゲームマップ表示のためにダブルバッファをしようとしております。
現在、下記のプログラムまでは書けていますが、このままでは画面が、ちらついてしまいます。
なお、下記コード中のhCDCは、裏画面のつもりです。また、マップチップ1マスあたりのサイズは32ピクセルです。マップサイズが現在7×10なので、それに相当する配列を用意しており、下記コードのFor文で、マップ読み込みをしています。
static HDC hCDC;
hCDC = CreateCompatibleDC(hdc);
static HDC hMdc;
HBITMAP hbmp;
//BMP画像をファイルから読み込む
hbmp = (HBITMAP)LoadImage(NULL, TEXT("mapchip_grass.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hMdc = CreateCompatibleDC(hdc);
SelectObject(hCDC, hbmp);
for (int x = 0; x <= 9; ++x)
{
for (int y = 0; y <= 6; ++y)
{
switch (maptable[y][x])
{
case (0):
hbmp = (HBITMAP)LoadImage(NULL, TEXT("mapchip_grass.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
break;
case (1):
hbmp = (HBITMAP)LoadImage(NULL, TEXT("mapchip_wall.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
break;
}
SelectObject(hMdc, hbmp);
BitBlt(hdc, 225 + x * 32, 140 + y * 32, 32, 32, hMdc, 0, 0, SRCCOPY);
}
}
上述のコードでは、マップ表示は出来るのですが、主人公の移動のたびに、画面が、ちらついてしまいます。
それで、「ちらつきを無くしたい」と思ったので、BitBltの第一引数をhdcではなく、裏画面のつもりの別ハンドル hCDCを第一引数にして、
として、さらにfor文のブロック外に、 と裏画面hCDCから本画面hdcに画像を一括転記するつもりで書きましたが、画面左上にマップチップが1個だけしか表示されず、
意図した表示になりません。
最終的にコードは、下記のようになっています。
static HDC hCDC;
hCDC = CreateCompatibleDC(hdc);
static HDC hMdc;
HBITMAP hbmp;
//BMP画像をファイルから読み込む
hbmp = (HBITMAP)LoadImage(NULL, TEXT("mapchip_grass.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hMdc = CreateCompatibleDC(hdc);
SelectObject(hCDC, hbmp);
for (int x = 0; x <= 9; ++x)
{
for (int y = 0; y <= 6; ++y)
{
switch (maptable[y][x])
{
case (0):
hbmp = (HBITMAP)LoadImage(NULL, TEXT("mapchip_grass.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
break;
case (1):
hbmp = (HBITMAP)LoadImage(NULL, TEXT("mapchip_wall.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
break;
}
SelectObject(hMdc, hbmp);
BitBlt(hCDC, 225 + x * 32, 140 + y * 32, 32, 32, hMdc, 0, 0, SRCCOPY);
}
}
SelectObject(hdc, hCDC);
BitBlt(hdc,0, 0, 502, 602, hCDC, 0, 0, SRCCOPY);
私は何かBitBltやダブルバッファについて勘違いをしているのでしょうか?