基于VC++6.0,且使用MFC框架。VC++6.0集成了GDI,所以能导入的图片的格
式只能是bmp的,如果想直接导入其它格式图片,请参阅GDI+方面的书籍。
首先建立一个单文档的工程test,这就不必多说了吧:-) ,
下面开始贴图:
1.导入图片(假设图片为map.bmp).
在test resources那里单击右键,选择Insert...,在弹出的Insert Resource
对话框左边选择Bitmap,然后点击右边的Import,打开文件map.bmp,这时候有可能弹出一
个对话框说一长串话,管它的呢,确定吧。然后看到Resources里面就多了一个Bitmap,
它下面就有一张图片了,ID为IDB_BITMAP1,这个ID可以自己修改。
以下工作的CTestView类的OnDraw函数中进行.
2.创建位图对象,并与要显示的图片(此处为IDB_BITMAP1标识的图片)关联.
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
3.创建兼容的DC,即内存DC.
CDC memDC;
memDC.CreateCompatibleDC(pDC);
4.将位图对象选入兼容DC.
memDC.SelectObject(&bmp);
5.将兼容DC中的位图贴到窗口.
pDC->BitBlt(x,y,width,height,&memDC,0,0,SRCCOPY);
其中(x,y)表示图片的左上角在窗口中的坐标,
idth,height分别表示图片的宽度和高度.
这样贴图就完成了.
但是在许多游戏编程中会出现画面不停的闪烁的情况,这是由于游戏中的物体是
不停的运动的,那就要不断的贴图,但是贴图是需要一定的时间的,当贴图更不上的时候,那就会闪了
要解决这个问题可以用DirectX,这里不做介绍.我要讲的是用缓冲机制解决:
1.同上面的2,3,4:
CBitmap bmp;
bmp.LoadBitmap(ID);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&bmp);
2.创建一个与你的窗口一样大的(如果是全屏的那就是整个屏幕的大小)兼容DC(及用于缓
冲的DC)和兼容位图,并将兼容位图选入兼容DC。
CBitmap BkMap;
BkMap.CreateCompatibleBitmap(pDC,w,h);//w,h表示窗口的宽和高
CDC BkDC;
BkDC.CreateCompatibleDC(pDC);
BkDC.SelectObject(&BkMap);
3.在缓冲DC上贴图
BkDC.BitBlt(x,y,width,height,&memDC,0,0,SRCCOPY);
如果有多张图片要同时贴在屏幕上,如有背景图,前景图,还可能有许
多小图片,那也要把这些图全部贴在这个缓冲DC上。
4.把缓冲DC的图片贴到屏幕。
pDC->BitBlt(0,0,w,h,&BkDC,0,0,SRCCOPY);
这就完成了缓冲,就是说贴每个图的过程全部都在缓冲DC上面完成,等所有的图
都贴到了缓冲DC上后,就把缓冲DC上的图一次性的贴到屏幕上。
但是这样还会存在一个问题,假设一个运动的物体运动过一个轨迹的话,那么这
个轨迹上面都会有这个物体,因为物体经过后,原来地方的图片并没有被搽除。
要解决这个问题也很简单,只要在每次往缓冲DC上面贴图的时候把缓冲DC”搽“
一下就可以了:怎么搽?往上面贴一张同样大小的白色图片不就把上面的内容搽?也可以用FillXXX函数进行填充。