|
|
发表于 2006-5-9 23:16:00
|
显示全部楼层
Re: 急!关于DirectDraw的一个问题!!!
我也初学游戏编程,说说我的理解
LPDIRECTDRAW7 lpdd; //主接口
LPDIRECTDRAWSUFACE7 lpddsprimary; //主表面
LPDIRECTDRAWSUFACE7 lpddsback; //副表面
LPDIRECTDRAWSUFACE7 lpddsoff; //离屏表面
//创建主接口
DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL);
//设置协作等级和显示模式,略
//取得住表面
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL);
//取得副表面
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsback);
主副表面的关系:相信你已经知道怎么在住表面上画图,但是我们不希望玩家看到我们表面上先出来一个飞船,再出来一个人物,再出来一个敌人吧。所以我们先把所有需要绘制的东西都渲染在副表面上,然后用lpddsprimary->Filp()来切换主副表面,使所有内容一下子出现在屏幕上。
然后是离屏表面
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_CKSRCBLT;
ddsd.dwWidth = width;
ddsd.dwHeight = height;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | mem_flag;(mem_flag决定离屏表面在显存中还是主存中)
lpdd->CreateSurface(&ddsd,&lpddsoff,NULL);
离屏表面的作用,我的理解是为了速度。与从内存中一个字节一个字节地将数据复制到住表面或者副表面上,directdraw的blt方法更快,可以充分利用硬件加速。所以我们通常讲精灵动作的每一帧做一个离屏表面,然后需要时将某一帧的离屏表面blt到副表面上,然后flip()。
请高手指导。
|
|