图像引擎DirectXDraw
目前win95下比较常用的图像引擎是DirectX,国内资料比较少,我给大家推荐过<<高性能WINDOWS图形设计>>这本书,大家不妨找一下.
在我们的游戏引擎中,目前使用的也是DirectX,网上见到有关DirectX的简化接口的对象库,没有使用过,不知如何,最好是自己做这些对象,灵活些.
图像引擎在游戏中的作用是这样的,设置显示模式,管理操作一种特殊图像表面,显示到屏
幕.
图像引擎对象:
class DirectDrawWin
{
HWND hWnd;
BOOL IsUse;
int winWidth,winHeight;
LPDIRECTDRAW2 ddraw2;
LPDIRECTDRAWSURFACE primsurf;
LPDIRECTDRAWPALETTE palette;
CDirectPAGE bakDirectPAGE;//背景表面,是CPICPAGE的继承对象CDirectPAGE的实例
LPDIRECTDRAWCLIPPER clipper;
RECT displayrect;
int displaydepth;
WORD loREDbit, numREDbits;
WORD loGREENbit, numGREENbits;
WORD loBLUEbit, numBLUEbits;
public:
DirectDrawWin();
~DirectDrawWin();
BOOL IsWorking(void);
int OnCreate(HWND _hWnd,BOOL IsFullWin=FALSE,int colors=16,int
width=640,int height=480);
void DrawScene();
BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD clr, RECT* rect=0 );
BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD r, DWORD g, DWORD b,RECT* rect=0 );
BOOL BltSurface(LPDIRECTDRAWSURFACE destsurf,LPDIRECTDRAWSURFACE srcsurf, int srcInX,
int srcInY,DWORD flap, RECT *DecView=NULL,RECT *souRectBlt=NULL,//源图片目标区
RECT *lpFillRect=NULL);
CPICPAGE *GetDecDrawPage(void);
LPDIRECTDRAWSURFACE CreateSurface( DWORD w, DWORD h );
HRESULT SetColorKey(IDirectDrawSurface *pdds, COLORREF rgb);
//======================================================================
private:
void SetHWnd(HWND _hWnd);
HWND GetSafeHwnd(){return hWnd;};
BOOL CreateFlippingSurfaces();
void OnDestroy();
DWORD RGBtoPixel(DWORD r, DWORD g, DWORD b);
void GetSurfaceRect(LPDIRECTDRAWSURFACE surf,RECT *lpRc);
DWORD ColorMatch(IDirectDrawSurface *pdds, COLORREF rgb);
BOOL GetSurfaceRect( LPDIRECTDRAWSURFACE surf, RECT& rect);
//////////////////////////////////////////////////////////////////////
WORD LowBitPos( DWORD dword );
WORD HighBitPos( DWORD dword );
BOOL StorePixelFormatData();
BOOL DetectDisplayMode();
};
大家可以看到,对外的接口有限,主要是初始设置OnCreate,输出到屏幕DrawScene,然后是表面的生成CreateSurface和图像操作ClearSurface,BltSurface; 初始设置OnCreate():初始DrectX,设置显示模式,申请前表面,背景表面.对于即时滚屏的游戏,为了加快速度,可以将背景表面设置得比显示区大,这样滚动时只要局部更改活动区,设置DrawScene时的起始位置即可.但我们没有使用这项技巧,我们的系统设计原则之一是:尽量少用技巧,靠系统设计提高速度,而不是局部技巧,原因是技巧的适应范围一般有限.系统尽量要求通用.
表面的生成和图像操作被一个叫CPICPAGE的通用图像页调用,CPICPAGE是一个包括各种位图格式的统一管理对象,游戏在进行图像操作时,不直接与DirectX图像表面打交道,CPICPAGE扩展了DirectX图像操作功能,比如带alpha通道的BLT,以及带亮度的BLT,直接对表面的Line,DrawTxt等.BltSurface()是一个包括许多剪裁定位输求的函数.
对于窗口模式下的DrawScene,为了避免屏幕产生图像撕裂现象,可以利用垂直同步刷新同步地更新屏幕,为了减少此过程的等待时间,可以使用多线程技术.
为了加快游戏显示速度,在使用DirectX中有许多可以挖掘的技巧.
有关DirectX的部分我不作详细介绍,网上有一部分资料,另外可参阅<<高性能WINDOWS图形设计>>一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代码的朋友可来信与我们联系.
目前win95下比较常用的图像引擎是DirectX,国内资料比较少,我给大家推荐过<<高性能WINDOWS图形设计>>这本书,大家不妨找一下.
在我们的游戏引擎中,目前使用的也是DirectX,网上见到有关DirectX的简化接口的对象库,没有使用过,不知如何,最好是自己做这些对象,灵活些.
图像引擎在游戏中的作用是这样的,设置显示模式,管理操作一种特殊图像表面,显示到屏
幕.
图像引擎对象:
class DirectDrawWin
{
HWND hWnd;
BOOL IsUse;
int winWidth,winHeight;
LPDIRECTDRAW2 ddraw2;
LPDIRECTDRAWSURFACE primsurf;
LPDIRECTDRAWPALETTE palette;
CDirectPAGE bakDirectPAGE;//背景表面,是CPICPAGE的继承对象CDirectPAGE的实例
LPDIRECTDRAWCLIPPER clipper;
RECT displayrect;
int displaydepth;
WORD loREDbit, numREDbits;
WORD loGREENbit, numGREENbits;
WORD loBLUEbit, numBLUEbits;
public:
DirectDrawWin();
~DirectDrawWin();
BOOL IsWorking(void);
int OnCreate(HWND _hWnd,BOOL IsFullWin=FALSE,int colors=16,int
width=640,int height=480);
void DrawScene();
BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD clr, RECT* rect=0 );
BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD r, DWORD g, DWORD b,RECT* rect=0 );
BOOL BltSurface(LPDIRECTDRAWSURFACE destsurf,LPDIRECTDRAWSURFACE srcsurf, int srcInX,
int srcInY,DWORD flap, RECT *DecView=NULL,RECT *souRectBlt=NULL,//源图片目标区
RECT *lpFillRect=NULL);
CPICPAGE *GetDecDrawPage(void);
LPDIRECTDRAWSURFACE CreateSurface( DWORD w, DWORD h );
HRESULT SetColorKey(IDirectDrawSurface *pdds, COLORREF rgb);
//======================================================================
private:
void SetHWnd(HWND _hWnd);
HWND GetSafeHwnd(){return hWnd;};
BOOL CreateFlippingSurfaces();
void OnDestroy();
DWORD RGBtoPixel(DWORD r, DWORD g, DWORD b);
void GetSurfaceRect(LPDIRECTDRAWSURFACE surf,RECT *lpRc);
DWORD ColorMatch(IDirectDrawSurface *pdds, COLORREF rgb);
BOOL GetSurfaceRect( LPDIRECTDRAWSURFACE surf, RECT& rect);
//////////////////////////////////////////////////////////////////////
WORD LowBitPos( DWORD dword );
WORD HighBitPos( DWORD dword );
BOOL StorePixelFormatData();
BOOL DetectDisplayMode();
};
大家可以看到,对外的接口有限,主要是初始设置OnCreate,输出到屏幕DrawScene,然后是表面的生成CreateSurface和图像操作ClearSurface,BltSurface; 初始设置OnCreate():初始DrectX,设置显示模式,申请前表面,背景表面.对于即时滚屏的游戏,为了加快速度,可以将背景表面设置得比显示区大,这样滚动时只要局部更改活动区,设置DrawScene时的起始位置即可.但我们没有使用这项技巧,我们的系统设计原则之一是:尽量少用技巧,靠系统设计提高速度,而不是局部技巧,原因是技巧的适应范围一般有限.系统尽量要求通用.
表面的生成和图像操作被一个叫CPICPAGE的通用图像页调用,CPICPAGE是一个包括各种位图格式的统一管理对象,游戏在进行图像操作时,不直接与DirectX图像表面打交道,CPICPAGE扩展了DirectX图像操作功能,比如带alpha通道的BLT,以及带亮度的BLT,直接对表面的Line,DrawTxt等.BltSurface()是一个包括许多剪裁定位输求的函数.
对于窗口模式下的DrawScene,为了避免屏幕产生图像撕裂现象,可以利用垂直同步刷新同步地更新屏幕,为了减少此过程的等待时间,可以使用多线程技术.
为了加快游戏显示速度,在使用DirectX中有许多可以挖掘的技巧.
有关DirectX的部分我不作详细介绍,网上有一部分资料,另外可参阅<<高性能WINDOWS图形设计>>一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代码的朋友可来信与我们联系.