您现在的位置是:首页 > 编程 > 

游戏编程之十一 图像页CPICPAGE介绍

2025-07-28 02:39:46
游戏编程之十一 图像页CPICPAGE介绍   图像页指的是内存中保存图像数据的各种表面,屏幕缓存,各种图片数据,窗口界面的界面数据等,不要只依靠DirectX的表面,最好单独用一个对象来管理这些内容,避免直接与DirectX打交道,这样改变引擎和移植到别的操作系统的工作量会小得多.   在我们的引擎设计中,CPICPAGE是一个功能强大而且扩充性极好的对象,比如我们不想使用DirectX表面

游戏编程之十一 图像页CPICPAGE介绍

  图像页指的是内存中保存图像数据的各种表面,屏幕缓存,各种图片数据,窗口界面的界面数据等,不要只依靠DirectX的表面,最好单独用一个对象来管理这些内容,避免直接与DirectX打交道,这样改变引擎和移植到别的操作系统的工作量会小得多.

  在我们的引擎设计中,CPICPAGE是一个功能强大而且扩充性极好的对象,比如我们不想使用DirectX表面,而想自己设计一种表面结构,游戏的其余部分不须任何改变,只要从CPICPAGE发展出CSELFPAGE的对象即可.象我知道的"腾图"公司的余雪松和吴冬黎(两个非常优秀的程序师,我从他们那里收益非浅,他们也是国内比较早的"xx"游戏站点的主人)就有一套自己的功能强大的图像表面,他们不使用DirectX表面.

  游戏对图像的操作一般不是直接对具体类型的表面操作,而是调用他们的根对象CPICPAGE.

在我们的游戏引擎中,图像页的结构是这样的:

  CPICPAGE

CBitmapPage //标准windows的位图,如果使用16M模式,对于一些不常更新的图像,使用

       //16M的DirectXDraw是种巨大的浪费,比如背景,我们可以保存一块比视

//口大的DirectXDraw表面作为背景区,只在一定条件下才将256原图

//CBitmapPage写入背景区(使用任意调版可保证非常高的图像质量,特别

//是使用Potoshop 5.0或Animatorfor Window 作为真彩转换256工具,颜

//失真极小),平时游戏读的是高速的DirectXDraw背景表面

CDirectXDrawPage//标准的DirectXDraw表面,

CGifPage//Gif动画表面,随着时间自动修改图像内容,继承CDirectXDrawPage

CAviPage//AVi动画表面,随着时间自动修改图像内容,继承CDirectXDrawPage,可以带自己线程

CFlcPage//Flc动画表面,随着时间自动修改图像内容,继承CDirectXDrawPage

目前我们只设计了这些类型,但可以供据需要随时扩充.

class CPICPAGE

{

protected:

char picStyle;//图像类型

BOOL CanWrite;//是否可以写

int picWidth,picHeight;//尺寸

DWORD activeMode;//静态,可释放,

unsigned short useTimeMark;//使用时间标记,如果长时间未使用,则保存到虚拟文件中

char *programeBuf;//可以用代码来控制图像的改变,

//我们支持脚本语言对图像进行特殊控制

char *lpImgBuf;//图像内存

long imgBufLen;//内存长度

HDC hDC;//标准设备句柄,指对CDirectXDrawPage和它的继承对象有效

BOOL hasChg;//图像内容是否已经改变

BOOL UseClip;//是否设定显示剪裁区

RECT clipRc;//显示剪裁区

public:

CPICPAGE();

~CPICPAGE();

virtual void Destroy(void);

char GetPicStyle(void);

BOOL GetSize(int *w,int *h);

void GetRect(RECT *lpRc);

char *GetImgBuf(void);

BOOL Load(char *lpFileame,long startOfs=0);从文件中读取内容

virtual BOOL LoadFile(FILE *lpFileHandle,long startOfs=0){return FALSE;};

virtual void BeginDraw(){};//如果是标准的DirectXDraw表面,再进行

//Window的标准图形读写时要获得HDC,如果是连续写,不要

//马上释放,反复申请和释放HDC会大大降低速度

virtual void EndDraw(){};//终止Window的标准图形读写,释放HDC

virtual HDC GetHDC(void){return ULL;};

virtual void Line(int bx,int by,int ex,int ey,COLORREF rgb);

virtual void drawStrgs(char *strg,short bx,short by,char drawBox,short choice);

virtual void Draw(RECT *lpRc,COLORREF *lpCr,char drawStyle,DWORD otherMess);

virtual void Fill(RECT *rc=ULL,COLORREF colorFill=0);

virtual void DrawRect(RECT *rc,COLORREF colorLeft,COLORREF colorRight,

COLORREF colorFill,COLORREF colorKey, DWORD drawStyle);

virtual BOOL BltInView( CPICPAGE *lpDec,

int srcInX, int srcInY, //x,y是souRectBlt相对于整个des表面的位置

DWORD flap=0, RECT *DecView=ULL, RECT *souRectBlt=ULL,//源图片目标区

RECT *lpFillRect=ULL) {return FALSE;};

virtual BOOL FillRect(CPICPAGE *lpSou,RECT *lpSouRect=ULL,RECT lpDecRect=ULL)

{return FALSE;};

virtual BOOL Scroll(int scrollX,int scrollY,RECT *lpRect=ULL){return FALSE;};

virtual BOOL ChgSize(int chgWidth,int chgHeight,int mode=0)

{return FALSE;};//0 设置尺寸,1 改变尺寸

virtual BOOL HasLost(void){return FALSE;}; //已经丢失图像数据

virtual BOOL Scroll(int scrollX,int scrollY,COLORREF fillColor=0,

RECT *lpScrollRc=ULL){return FALSE;};

virtual void TimeTrace(vodi);//时间跟踪,动画可以在此时更改自己的图像

};

class CDIBPAGE:public CPICPAGE

{

HDIB hDIB;

LPSTR lpDIBHdr;

unsigned aLineByte;

BYTE biBitCount;

char style;

char *LpGetIMG(void);

public:

CDIBPAGE(){picStyle=BMPPIC;};

BOOL Creat(int width,int height,DWORD mode=0);

BOOL SetBmp(char *_lpImgBuf);

BOOL LoadFile(FILE *lpFileHandle,long startOfs=0);

BOOL StretchDIBits(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,DWORD dwRop,BOOL canChg=FALSE);

BOOL Blt(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,DWORD dwRop=SRCCOPY);

virtual BOOL BltInView( CPICPAGE *lpDec,

int srcInX, int srcInY,//x,y是souRectBlt相对于整个des表面的位置

DWORD flap=0, RECT *DecView=ULL, RECT *souRectBlt=ULL,//源图片目标区

RECT *lpFillRect=ULL);

};

class CDirectPAGE:public CPICPAGE

{

LPDIRECTDRAWSURFACE surf;

public:

CDirectPAGE(){surf=ULL;picStyle=DIRECTPIC;}

~CDirectPAGE();

void Destroy(void);

BOOL Creat(int width,int height,DWORD mode=0);

LPDIRECTDRAWSURFACE GetSurface(void) {EndDraw();return surf;}

virtual BOOL LoadFile(FILE *lpFileHandle,long startOfs=0);

HDC GetHDC(void);

void BeginDraw();

void EndDraw();

virtual BOOL BltInView( CPICPAGE *lpDec,

int srcInX, int srcInY,//x,y是souRectBlt相对于整个des表面的位置

DWORD flap=0, RECT *DecView=ULL, RECT *souRectBlt=ULL,//源图片目标区

RECT *lpFillRect=ULL);

void Fill(RECT *rc=ULL,COLORREF colorFill=0);

BOOL Scroll(int scrollX,int scrollY,COLORREF fillColor=0, RECT *lpScrollRc=ULL);

};

  这里面我只列举了一些常用的接口,另外还有一些象带alpha通道的BLT,line,以及带亮度的BLT,Line等,可以供据游戏的要求随时扩充.对标准DirectXDraw表面,我们可以在开始时使用一些window的库函数,然后如果时间允许再改为自己的速度更快的函数.系统设计时一般先完成功能,中后期才作优化,不要一开始马上陷入过多的技术细节,除非是决定系统成败的关键的速度要求.

  通过二,三章的工作,现在系统便可以显示一些图像和动画了,显示部分有关的内容基本就完成,下一章介绍资源管理.声音部分在最后介绍,因为那部分实现起来比较简单.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2022-04-06,如有侵权请联系 cloudcommunity@tencent 删除编程动画对象数据游戏

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1253075.html

相关标签:无
上传时间: 2025-07-27 22:32:57
留言与评论(共有 14 条评论)
本站网友 王子瑜
14分钟前 发表
RECT *lpScrollRc=ULL){return FALSE;}; virtual void TimeTrace(vodi);//时间跟踪
本站网友 波推是什么意思
11分钟前 发表
int srcInX
本站网友 守信是一项财宝
6分钟前 发表
long startOfs=0);从文件中读取内容 virtual BOOL LoadFile(FILE *lpFileHandle
本站网友 可圈可点是什么意思
15分钟前 发表
继承CDirectXDrawPage CAviPage//AVi动画表面
本站网友 苹果概念机
5分钟前 发表
unsigned short useTimeMark;//使用时间标记
本站网友 国际禁毒日是几月几日
6分钟前 发表
但可以供据需要随时扩充. class CPICPAGE { protected
本站网友 本溪房产
20分钟前 发表
反复申请和释放HDC会大大降低速度 virtual void EndDraw(){};//终止Window的标准图形读写
本站网友 营养土
1分钟前 发表
RECT *DecView=ULL
本站网友 建材b2b
9分钟前 发表
屏幕缓存
本站网友 不锈钢网站
11分钟前 发表
//x
本站网友 郭应龙
0秒前 发表
picHeight;//尺寸 DWORD activeMode;//静态
本站网友 周边配套
17分钟前 发表
他们不使用DirectX表面.   游戏对图像的操作一般不是直接对具体类型的表面操作
本站网友 运城租房
25分钟前 发表
比如背景