Programming 版 (精华区)

发信人: Aaron (飞翔的鸟), 信区: Programming
标  题: 游戏设计(2) 
发信站: 紫 丁 香 (Sun Sep 13 11:59:57 1998), 转信

发信人: sailinn (阿航), 信区: GAME_Designer 
标 题: 游戏设计(2) 
发信站: BBS 水木清华站 (Mon Sep  7 19:11:42 1998) WWW-POST 
 
 
                      游戏设计:设计工具之游戏引擎  
    之二:图像引擎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图形设计>>一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代 
 
 
码的朋友可来信与我们联系.  
 
 
今天就写到这里,欢迎同志商讨.我们尽量回答朋友们的意见,欢迎加入我们的队伍.  
 
    联系:北京歌灯数码有限公司,  
           
         gedn@public.bta.net.cn  
 
                电话:010-62570758  
----------------------------------------------------------------


--

 ┍━━━━━━━━━━┓
 ┃ 永远没有梦的尽头   ┃ 
 ┃  永远没有不灭幻想  ┃ 
 ┗━━━━━━━━━━┛ 
                          

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: jxjd.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.088毫秒