5:BMP表示

さぁだんだんDirectDrawらしくなってきた感じです。 今回はBMP表示ですが、一体どうやったらいいのかというと、
  1. オフスクリーンバッファを作成
  2. BMP読み込み
  3. パレット作成&読み込み(8bpp以下)
  4. BMPを表示…
といった感じです。

「オフスクリーン作成&BMP読み込み」

まずは、BMPようのオフスクリーンバッファを作成し、そこにBMPを読み込みます。 BMPはプログラムのリソース内に作っておきます。

LPDIRECTDRAWSURFACE lpDDSSprite;

・・・
// オフスクリーンバッファの作成
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.dwBackBufferCount = 0;
ddsd.dwWidth = 128; // 横サイズ
ddsd.dwHeight = 128; // 縦サイズ
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
lpDD->CreateSurface(&ddsd,&lpDDSSprite,0);

// BMP読み込み
LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP),lpDDSSprite);
・・・
// 解放
if(lpDDSSprite ) lpDDSSprite ->Release(); lpDDSSprite =0;
if(lpDDSPrimary) lpDDSPrimary->Release(); lpDDSPrimary=0;
if(lpDD) lpDD->Release(); lpDD=0;

オフスクリーンバッファ関係は今までのサーフィスとほとんど同じですね。 今回はプライマリとは別に作っているので、プライマリとは別々に解放します。 ちなみにここで使っている LoadBitmap はWin32APIではなく自分で作っているモノです。
int CAPPMAIN::LoadBitmap(char *strBmp,LPDIRECTDRAWSURFACE lpDDSdest)
{
	// BMP読み込み
	HBITMAP hBmp=(HBITMAP)LoadImage(GetModuleHandle(0),strBmp,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
	if(!hBmp) return 1;

	// BMP情報取得
	BITMAP bmp;
	GetObject(hBmp,sizeof(BITMAP),&bmp);
	int w=bmp.bmWidth;
	int h=bmp.bmHeight;

	// BMP転送
	HDC hDCmem=CreateCompatibleDC(0);
	SelectObject(hDCmem,hBmp);

	HDC hDC;
	lpDDSdest->GetDC(&hDC);
	BitBlt(hDC,0,0,w,h,hDCmem,0,0,SRCCOPY);
	lpDDSdest->ReleaseDC(hDC);

	DeleteDC(hDCmem);
	DeleteObject(hBmp);

	return 0;
}

BMPを読み込み、サイズを取得し、DCを使ってサーフィスに書き込んでいます。 次は一つ飛ばしで描画部分を説明します。

// 玉
for(int i=0;i<10;i++)
{
	// RECT作成
	RECT rcDest,rcSrc={0,0,32,32};
	rcDest.left=rand()%(640+32)-32; rcDest.right=rcDest.left+32;
	rcDest.top =rand()%(480+32)-32; rcDest.bottom=rcDest.top+32;
	rcSrc.left=(rand()%4)*32; rcSrc.right=rcSrc.left+32;

	// BMP転送
	lpDDSBack->Blt(&rcDest,lpDDSSprite,&rcSrc,DDBLT_WAIT,0);
}

Blt を使用して、オフスクリーンバッファからバックバッファへ書き込んでいます。 あとはフリップすれば表示されるわけです。 さて、あとはパレットだけですね。でもそれは次回にします( ;^^)ヘ..

Download dd005.lzh - BMP表示


★TOP★

Copyright(C) へぽぽ