|
|
按照网络上的一种方式,说是使用GDI接口加载位图然后拷贝到DDRAW中这样,可以适应8,16,24位的各种BMP图.我以前是按<WINDOWS游戏编程大师技巧>的代码写的可以正常运行和显示,但是换成以上的方法后就无法显示了以下是具体的代码.
//创建表面然后在拷贝图到表面上去
void CreateBitmapSurface(LPDIRECTDRAWSURFACE7 lpSurface, char *fname, int xs, int ys)
{
HBITMAP hBitmap;
CreateSurface(&lpSurface, xs, ys);
hBitmap = (HBITMAP)LoadImage(NULL, fname, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
DrawHBitmap(lpSurface, hBitmap, 0, 0, xs, ys);
DeleteObject(hBitmap);
}
//加载位图到表面
void DrawHBitmap(IDirectDrawSurface7 *lpSurface, HBITMAP hBitmap, int x, int y, int width, int height)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
if (lpSurface == NULL || hBitmap == NULL)
return;
lpSurface->Restore();
hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hBitmap);
GetObject(hBitmap, sizeof(bm), &bm);
width = width == 0 ? bm.bmWidth : width;
height = height == 0 ? bm.bmHeight : height;
lpSurface->GetDC(&hdc);
BitBlt(hdc, x, y, width, height, hdcImage, 0, 0, SRCCOPY);
lpSurface->ReleaseDC(hdc);
DeleteDC(hdcImage);
}
//创建表面
void CreateSurface(LPDIRECTDRAWSURFACE7 *lpSource, int xs, int ys)
{
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = xs;
ddsd.dwHeight = ys;
lpdd->CreateSurface(&ddsd, lpSource, NULL);
}
然后我在Game_Init里面初始化了游戏的背景表面,代码如下
CreateBitmapSurface(lpddsbackground,"bitmap24.bmp",SCREEN_WIDTH,SCREEN_HEIGHT);
然后在Game_Main中BLT了表面到我的主显示表面,代码如下
lpddsprimary->Blt(NULL,lpddsbackground,NULL,DDBLT_WAIT,NULL);
编译没有任何问题,然后显示就是一片漆黑,请问为什么了.
|
|