在游戏中,角色位图的位置是不断变化的,所以设备上下文中合成位图的内容也是不断变化的。为了实现游戏画面的刷新,通常是利用缓存设备环境来保存下一帧的合成位图对象,下一帧的合成位图对象是根据角色位图的实时位置和状态重新渲染后的结果。
位图绘制
- 1.加载位图,从文件中加载位图对象
- 2.建立兼容DC,建立一个与窗口设备环境DC兼容的内存设备环境DC
- 3.选用位图对象,内存DC使用步骤1中所建立的位图对象
- 4.进行贴图,将内存DC中的内容贴到窗口DC中
-
加载
一般从文件中加载,使用的是LoadImage()。不仅可以加载位图,还可以加载图标、光标等图像资源。
HANDLE LoadImage(
HINSTANCE hinst, //来源实例句柄
LPCTSTR lpszName, //名称
UINT uType, //加载的类型
int cxDesired, //指定存储的宽度
int cyDesired, //指定存储的高度
UINT fuLoad //加载的方式
);
第一个参数:HINSTANCE类型 的hinst,包含被加载图像模型的实例句柄,若从硬盘文件或者资源文件中进行加载,这个参数设置为NULL
第二个参数:LPCTSTR类型的lpszName,被加载的资源所在的路径与文件名或者资源名
第三个参数:UINT 类型的uType,指定被加载的图像类型,可取值为以下三种之一:
IMAGE_BITMAP:加载的图像是位图文件,扩展名为.bmp;
IMAGE_CUSOR:加载的图像是光标文件,扩展名为.cur;
IMAGE_ICON:加载的图像是图标文件,扩展名为.ico;
第四个参数:int类型的cxDesired,指定光标或者图标加载后在内存中存储的宽度,单位是像素。
第五个参数:int类型的cyDesired,指定光标或者图标加载后在内存中的存储的高度,单位为像素
第六个参数:UINT类型的fuLoad,指定位图加载方式,若是从文件中加载图像,需要设置为LR_LOADFROMFILE
如HBITMAP g_hBitmap=(HBITMAP)LoadImage(NULL,L”Dota2.bmp”,IMAGE_BITMAP,800,600,LR_LOADFROMFILE);//加载位图,表示加载一副名为Dota2图片的bmp文件到位图句柄g_hBitmap中,且加载后在内存中这幅图存储宽带为800,高度为600兼容
为了绘制出位图,我们需要创建一个和设备环境兼容 的内存设备环境,这样才会有暂时存放位图对象的地方。
把位图对象用SelectObject函数选入到内存设备环境中,然后再用贴图函数,把内存设备环境中的内容贴到设备环境中。内存DC在这里起到中转站的作用,用于暂时存储加载好的位图,由于我们最终会把暂存在内存DC上这幅位图贴到真正DC上,所以这个DC要做到与窗口DC的无缝衔接。我们一般使用CreateCompatible()函数来建立内存DC。
CreateCompatibleDC函数的作用就是创建一个与指定DC相兼容的内存DC,
HDC CreateCompatibleDC(__in HDC hdc);//创建有窗口DC兼容的内存DC
HDC类型的hdc,需要填写与内存DC兼容的目的DC的句柄,如果这个句柄为NULL,那么CreateCompatibleDC函数将创建一个与应用程序的当前显示器兼容的内存设备上下文环境跟窗口一样,内存DC使用后也必须进行释放的操作。
BOOL DeleteDC(__in HDC hdc);选用位图对象
SelectObject()
贴图
将内存DC中的内容复制到设备环境DC中,就实现了贴图的效果。这个操作使用的函数有很多,如BitBlt() TransparentBlt() 或者StretchBlt();
BitBlt函数的功能就是从源矩形中复制一个位图到目标矩形中,必要时候按照目前目标设备设置的模式进行图像的拉伸或压缩。
BOOL BitBlt(
__in HDC hdcDest //目标设备环境句柄
__in int nXDest //目的DC的X坐标
__in int nYDest //目的DC的Y坐标
__in int nWidth //贴到目的DC的宽度
__in int nHeight //贴到目的DC的高度
__in HDC hdcSrc //源设备环境句柄
__in int nXSrc //来源DC的x坐标
__in int nYSrc //来源DC的y坐标
__in DWORD dwRop //贴图方式
)
第九个参数:DWORD类型的dwRop,指定光栅操作代码,即贴图的方式。这些代码定义着源矩形区域的颜色数据,将如何与目标矩形区域的颜色数据组合以完成最后的颜色。
图像文件是以一个四四方方的矩形来存储的。