文档
第三回:图形引擎(1)
这一回讲讲我们的图行引擎的基本结构,比如是支持什么样的图片,用什么样的方式显示图片,怎么架构我们的各个页面,是一个什么样子的运作方式等等.这个部分决定了我们的图片引擎的写法.
先说我们要支持的图片格式,bmp是必须的,还能支持带alpha通道的tga图片,至于像什么jpeg这些,需要的时候我们可以再加上.bmp的图片没有什么要求,随便就好,对于tga的图片,我们只支持24位或者32位的非调色板格式,压缩和不压缩都可以.
引擎要有两个模式,全屏幕的和窗口的,我们的显示方式也就是用blt的方式,不用flip的方式.页面的设计也就这样,一个主页面,一个后台页面(放到系统内存,offscreen),这个是基本的情况,以后要创建其他的offscreen页面也都是系统内存.殷勤使用16位模式.
引擎还是采用常用的每帧全部重画的方式显示,虽然这个方式不是一个正确的方式,但是因为简单,所以我们暂时使用它,以后我们可以修改成只画改变部分的方式提高效率.
引擎显示图片的方式:先把要显示出来的页面按照顺序一一blt到后台页面,然后把后台页面blt到主页面,这样也就决定了我们的大部分操作的目标表面都是后台页面.
引擎编码使用c++,dx8已经有了几个封装好了的ddraw的类,我们借用下好了:)
一个叫CDisplay的类表示ddraw对象,主页面和后台页面,这个类控制大多数的blt操作.一个CSurface类控制所有的offscreen对象,负责加载图形数据,管理图形数据.程序中需要创建一个CDisplay对象,然后进行一系列的设置,然后根据需要创建出相当的CSurface对象,加载图形,以后有blt操作的时候,调用CDisplay对象的相关函数,把CSurface对象作为参数就可以了.
下面我们看看CDisplay都要有些什么样子的成员变量和成员函数.
首先,要一个表征应用程序窗口句柄的m_hWnd,一个表示是否是窗口模式的BOOL型变量,一个LPDIRECTDRAW7对象,两个LPDIRECTDRAWSURFACE7对象(主页面和后台页面),一个表示窗口矩形的RECT对象,因为我们用的是16位模式,那也要一个表示是否是555格式的BOOL对象.(16位下面每个点占16位,存在多种格式,最多的是两种,一个是555,就是说rgb分别是5位,空出一位不用,一种是565,就是说rb都是5位,g的6位).一个表示能不能用窗口模式的BOOL变量.CDisplay的成员变量大致这样,随着功能的增加,还会增加.
接着是成员函数.这个类包括的大多数的操作,那我们就要实现大多数的页面操作.先是要有普通的访问函数,比如是上面的那些成员变量的访问.然后是相关的创建销毁操作,还有blt操作,更新主表面操作,最后有些杂项,比如是模式切换等等.
这一回是对整个图形引擎的一个总体规划,从下一回起,我们就要实作出这个图形引擎来.
|