Windows Game Note5

来源:互联网 发布:numpy 稀疏矩阵 编辑:程序博客网 时间:2024/04/29 22:01

1、 设置DirectDraw裁剪,需要执行以下步骤

   创建DirectDraw裁剪器对象,使用IDIRECTDRAW7::CreateClipper()函数

   创建裁剪序列(是矩形的列表,存储为RECT结构,这些矩形对应于可以进行blit的有效区域)

   IDIRECTDRAWCLIPPER::SetClipList()将裁剪序列发送给裁剪器

   IDIRECTDRAWSURFACE7::SetClipper()将裁剪器同窗口和/或表面相关联

2、 创建一个裁剪序列,只需填写一个成为RGNDATA(Region Data)的数据结构

typedef struct _RGNDATA {

   RGNDATAHEADER  rdh;

   char           Buffer[1];

} RGNDATA;

你所需要做的一切就是分配足够的内存给RGNDATAHEADER结构,连同一块用以存储一个或多个连续RECT结构的内存。

3、 多数时候都是用离屏渲染表面的指针来调用SetClipper,通常,你并不会将裁剪器关联到主表面。

4、 Windows <wbr>Game <wbr>Note5

位图文件头:它存放着图像的总体信息,存放在Win32数据结构BITMAPFILEHEADER

typedef struct tagBITMAPFILEHEADER {

       WORD   bfType;//文件类型,必须为0x4D42 for BMP

       DWORD  bfSize;

       WORD   bfReserved1;

       WORD   bfReserved2;

       DWORD  bfOffBits;

} BITMAPFILEHEADER;

位图信息段:包括两部分数据结构,即BITMAPINFOHEADER部分和调色板信息部分(如果有的话)

typedef struct tagBITMAPINFO {

   BITMAPINFOHEADERbmiHeader; //the info header

   RGBQUAD            bmiColors[1];//palette(if there is one)

} BITMAPINFO;

 

 

 

BITMAPINFOHEADER结构如下:

typedef struct tagBITMAPINFOHEADER{

       DWORD     biSize;

       LONG      biWidth;

       LONG      biHeight;

       WORD      biPlanes;

       WORD      biBitCount;

       DWORD     biCompression;

       DWORD     biSizeImage;

       LONG      biXPelsPerMeter;

       LONG      biYPelsPerMeter;

       DWORD     biClrUsed;

       DWORD     biClrImportant;

} BITMAPINFOHEADER;

8位图像通常使biClrUsedbiClrImportant两字段均为256,而16位或24位图像则均为0,因此,应当通过测试biBitCount找出每像素有多少位。

位图数据区:它是一个字节流,描述了1481624位图像像素,数据是逐行排列的,但是有时会颠倒过来,即数据的第一行其实是图像的最后一行。可以通过biHeight的正负号来知道这点,正值表示颠倒,负值表示正常。

为了自行读取一个.BMP文件,首先需要打开它,然后读取BITMAPFILEHEADER,接着读BITMAPINFO部分,即BITMAPINFOHEADER外加调色板,调色板项是RGBQUAD,是正常的PALETTEENTRYs的倒序:

typedef struct tagRGBQUAD {

       BYTE   rgbBlue;

       BYTE   rgbGreen;

       BYTE   rgbRed;

       BYTE   rgbReserved;

} RGBQUAD;

5、 文件读取

int file_handle;

OFSTRUCT file_data;

OpenFile(file_handle, &file_data,OF_READ);

_lread(file_handle, ..);

_lseek(file_handle, ..);

_lclose(file_handle);

6、 在调色板同8DirectDraw表面关联之后改变调色板项,你只需使用IDIRECTDRAWPALETTE::SetEntries()函数。

7、 DirectDraw存在的目的就在于利用硬件加速,可是除非你用DirectDraw的数据结构和对象来保存位图,否则你是不能做到这点的。DirectDraw是使用blitter的关键。

创建一个通用的既非主表面又非后备缓冲的离屏DirectDraw表面:

  必须将DDSURFACEDESC2.dwFlags设置为(DDSD_CAPS | DDSD_WIDTH |DDSD_HEIGHT)

  必须在DDSURFACEDESC2.dwWidthDDSURFACEDESC2.dwHeight中设置请求表面的尺寸

  必须将DDSURFACEDESC2.ddsCaps.dwCaps设置为DDSCAPS_OFFSCREENPLAIN |memory_flags,其中的memory_flags决定在哪里创建表面。如果将它设置为DDSCAPS_VIDEOMEMORY,则表面将被创建在VRAM中,如果将它设置为DDSCAPS_SYSTEMMEMORY,表面将被建立在系统内存中,这使blitter几乎不会被用到,因为位图数据不得不通过系统总线传输。

Windows <wbr>Game <wbr>Note5

8、 设置blitter,需要执行以下步骤:

   设置要blit出来的源RECT结构,则是包含相关图像的小的表面

   设置目标RECT,通常就是后备缓冲

   用适当的参数调用IDIRECTDRAWSURFACE7::Blt()

如果你使目标RECT比源RECT大或者小,图形转换将自动缩放图像来适应你指定的目标尺寸。

9、 色彩键(ColorKey)

  源色彩键:一般而言,你可以选择单一色彩索引(256色模式下)或者一定范围的RGB色彩作为源图像的透明色。然后,将源blit向目标时,不拷贝具有透明色的像素。你既可以在创建表面时设置色彩键,也可以在之后用函数IDIRECTDRAWSURFACE7::SetColorKey()设置。

如果你为源色彩键设置了一个色彩范围(色彩空间),在调用SetColorKey()时必须加上标志DDCKEY_COLORSPACE,否则DirectDraw将使色彩范围坍缩为一个值。

  目标色彩键:基本思想是:你可以在目标表面上设定一种或者一个色彩范围,具有这样的颜色的像素不能够被blit上去。设置目标色彩键与设置源色彩键方法相同,只需要改变两个标志。DDSD_CKDSTBLT  ddsd.ddckCKDestBlt

10、当你进行blit时要考虑到裁剪,还没有设置好裁剪区就开始朝表面上进行blitting会很糟糕,你需要做的就是调用你的DDraw_Attach_Clipper函数,设一个单独的同屏幕边界等大的裁剪矩形区域。