二:我想实现图片显示
当你玩游戏的时候,有没有对里面多彩的画面感到好奇,在实现图片显示之前我想有必要说明游戏画面工作机制(个人理解,可能与真实情况有些出入,当然三维立体游戏除外,参考用)
以愤怒的小鸟游戏为例,我想你一定玩过:
当你进入游戏,里面有个游戏场景,一个弹弓,几只小鸟,一堆木块..
其实游戏场景是图片,弹弓是图片,小鸟是图片,木块还是图片,不相信的话可以再你电脑里愤怒的小鸟游戏客户端里查看有没有这些图片。当然游戏中各种动作是通过API、数学逻辑(小鸟飞行)、力学原理(木块有组织的坍塌)、美术设计等相结合才能设计出来的。好了,言归正传:
GDI显示图片:
HBITMAP
gBitmap=NULL;
if(gBitmap==NULL)
{
gBitmap=
LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
}
if (gBitmap1)
{
HDC
lTempDc = CreateCompatibleDC(hdc);
SelectObject(lTempDc,gBitmap);
BITMAPbm;
GetObject(gBitmap,sizeof(BITMAP), (LPSTR)&bm);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt (hdc, 0, 0,cxClient,cyClient,lTempDc, 0,
0,bm.bmWidth,
bm.bmHeight, SRCCOPY) ;
}
GDI+显示图片:
HDC hMemDC=CreateCompatibleDC(hdc);
HBITMAP hMemBM=CreateCompatibleBitmap(hdc,cxClient,cyClient);
//创建兼容DC和兼容位图,为什么要这样做呢?当你用上面的GDI方法没有创建兼容DC,你会发现图片总是在不停地闪烁,真的很讨厌,我上网查了一下,了解了一下,其实你的PC显示屏不是静态的,而是以一定的频率在不停地刷新(人眼无法感知),所以图片闪烁也就是这个原因,程序员调用API显示图片其实在内部计算机是图片像素一位一位的复制到显示屏上(显示屏也是个存储区),如果创建兼容DC(和用BeginPaint返回的DC一样),像素就首先一位一位的复制到兼容DC上,这就相当于一个缓冲区,然后将像素一次性全部复制到显示屏上,这就解决了闪烁问题。
SelectObject(hMemDC,hMemBM);
Graphics g(hMemDC);
static Image *gImag=NULL;
if (gImag==NULL)
{
gImag=Image::FromFile(_T("setup0.jpg"));//这里的_T("setup0.jpg")可以替换成TEXT("setup0.jpg")或者L” setup0.jpg”,不过为了代码的可读性建议统一用一种方法。
}
g.DrawImage(gImag,0,0,100,100);
BitBlt(hdc,0,0,100,100,hMemDC,0,0,SRCCOPY);
DeleteObject(hMemBM);
ReleaseDC(hwnd, hMemDC);