文档
第四回:图形引擎(2)
这一回我们实作出这个图形引擎来.
先放上图形引擎的头文件:gp_draw.h
还有一个叫goldpoint.h的头文件,里面主要是include,define,pragma,也post上来.
接着我们看看这两个类.
CDisplay管理DirectDraw对象和主页面以及后台页面对象.他的成员函数解释如下:
创建显示两个函数,根据传入的参数创建出适当的显示模式,并且设置好是否是窗口模式,主窗口句柄,计算窗口矩形,然后初始话点格式.
创建surface的几个函数和CSurface类配合,创建出Surface并且根据需要加载图形.都是先根据图形数据得到大小,然后根据这个大小创建出surface,然后加载数据到surface.要求是让传入的CSurface指针为NULL.tga的部分支持24位,32位rle压缩或者是不压缩的图片,而且要设置alpha通道数据,通道数组大小要比宽度*高度多3,是因为进行alpha混合的时候不出现越界访问.
两个blt函数都是把一个surface blt到后台surface.先是进行矩形指针测试是不是空,空就初始成整个页面大小,然后进行边界检查,最后进行blt操作.
四个alpha的函数一样先进行alpha检查,然后是边界检查,接着取两个surface指针,计算相关坐标,然后根据点格式进行mmx的alpha混合.mmx寄存器占用情况:mm0和mm1是红色用,mm2,mm3是绿色用,mm4和mm5是蓝色用,mm6是alpha值,mm7是alpha/4的值.带colorkey的mm3是放colorkey,mm5放源点,mm7放目标点,mm6也会用到的(colorkey的方式:mm3和mm5比较,mm3中相同的点的相应位为ffff,然后mm3赋给mm6,然后mm3取反与上计算结果点,这样结果点里面的那些colorkey的位就位0,然后mm6与上mm7,这样colorkey的点保存下来,其他的为0,然后把mm3和mm7或得到最后的结果).带alpha通道的混合,还检查了alpha的值是0或者是ff的时候简单处理.
更新操作只是简单的把后台页面blt到前台页面.
显示模式切换,先检查能否切换,然后再进行模式切换,释放显存对象, 更改主窗口的style,重新创建主表面,初始化点格式,更新窗口矩形.
更新窗口矩形函数使用ClientToScreen函数进行坐标计算.
CSurface类负责管理offscreen surface,包括他的创建加载以及销毁.这个类主要是数据保存和获取,在CDisplay类的帮助下创建出一个一个的surface,然后加载图形数据,然后lock一次得到surface数据比如是宽度,高度,跨度和surface
buffer的指针,因为是在system memory,所以只有一次lock就能得到所有的数据.成员函数解释如下:
加载bmp图片是用api的方式,加载tga图片是直接的memcpy,(打开文件获得数据写入surface)并且设置好alpha通道,这里alpha通道数组要比图形宽度*高度多三bytes,因为在进行alpha混合的时候才不会出现数组越界.
创建函数多用第一个,根据ddsd的数据创建一个surface.
销毁函数还要记得释放alpha通道数组.
初始化函数完成唯一的一次lock和unlock操作,填充surface相关数据.
BeginDraw和EndDraw函数分别进行lock和unlock操作.
两个blt函数完成其他surface到本surface的blt操作.
设置colorkey函数利用转换GDI颜色函数进行设置colorkey.
而转换函数是把一个RGB这样的显示模式无关值转换成相关值.
GetBitMaskInfo得到位掩码信息.
使用这个两个类来进行图形操作,使用说明:
先声明唯一的一个CDisplay指针,然后new出一个CDisplay对象,调用其CreateFullScreenDisplay或者是CreateWindowDisplay函数,创建显示模式,然后声明一系列的CSurface指针,调用CDisplay的CreateSurfaceFromXXX创建出相关的offscreen
surface.然后应用blt等函数进行图形操作,需要显示的时候用Present函数显示到Primay surface,在释放的时候要分别的delete
CDisplay对象和所有的CSurface对象.
这一回就到这里,下一回会对这两个类的一些关键函数进行详细的解释,并且做出一个demo来测试我们的引擎.
|