视频课:【免费】跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院
  图像页指的是内存中保存图像数据的各种表面,屏幕缓存,各种图片数据,窗口界面的界面数据等,不要只依靠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 *lpFileName,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 NULL;}; 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=NULL,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=NULL, RECT *souRectBlt=NULL,//源图片目标区 RECT *lpFillRect=NULL)  {return FALSE;}; virtual   BOOL  FillRect(CPICPAGE *lpSou,RECT *lpSouRect=NULL,RECT lpDecRect=NULL) {return FALSE;}; virtual   BOOL  Scroll(int scrollX,int scrollY,RECT *lpRect=NULL){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=NULL){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=NULL, RECT *souRectBlt=NULL,//源图片目标区 RECT *lpFillRect=NULL);
}; class CDirectPAGE:public CPICPAGE
{ LPDIRECTDRAWSURFACE surf;
public: CDirectPAGE(){surf=NULL;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=NULL, RECT *souRectBlt=NULL,//源图片目标区 RECT *lpFillRect=NULL); void  Fill(RECT *rc=NULL,COLORREF colorFill=0); BOOL  Scroll(int scrollX,int scrollY,COLORREF fillColor=0, RECT *lpScrollRc=NULL);
}; 

  这里面我只列举了一些常用的接口,另外还有一些象带alpha通道的BLT,line,以及带亮度的BLT,Line等,可以供据游戏的要求随时扩充.对标准DirectXDraw表面,我们可以在开始时使用一些window的库函数,然后如果时间允许再改为自己的速度更快的函数.系统设计时一般先完成功能,中后期才作优化,不要一开始马上陷入过多的技术细节,除非是决定系统成败的关键的速度要求. 
  
  
  通过二,三章的工作,现在系统便可以显示一些图像和动画了,显示部分有关的内容基本就完成,下一章介绍资源管理.声音部分在最后介绍,因为那部分实现起来比较简单.

游戏编程之十一 图像页CPICPAGE介绍相关推荐

  1. 重发老文:DOS游戏编程二十一条

    这是我1999年写的一篇文章了,应该说,经过了这么多年的进步,文中很多与DOS相关的内容,现在看起来已经不合时宜了,不过,我认为里面的一些理念,到任何时候都不会过时. 最近看到tr110223网友的& ...

  2. 游戏编程之十 图像引擎DirectXDraw

    视频课:[免费]跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院 图像引擎DirectXDraw 目前win95下比较常用的图像引擎是Dire ...

  3. DOS 游戏编程二十一条

    我在一家游戏公司多年,现就自己的编程经验谈一点体会,希望能对大家有点帮助,本文中所有例子均在 WATCOM C/C++ 10.6 下调试通过. 1.找一种好的编程语言. 当然,游戏可以用任何语言编写, ...

  4. DOS游戏编程二十一条

    我在一家游戏公司多年,现就自己的编程经验谈一点体会,希望能对大家有点帮助,本文中所有例子均在WATCOM C/C++ 10.6下调试通过. 1.找一种好的编程语言: 当然,游戏可以用任何语言编写,这是 ...

  5. 游戏编程这些年的苦与乐

    本文来自于一位做游戏编程的网友. 编程之前 大概是读初一的时候,家中有幸让我得到了一台二手电脑,那时的心情比现在让我得到一堆苹果电脑更加兴奋.但这是一台不能连网,也没有任何游戏和软件的电脑(扫雷.纸牌 ...

  6. Android 4游戏编程入门经典

    <Android 4游戏编程入门经典> 基本信息 原书名:Beginning Android 4 Games evelopment 作者: (美)Mario Zechner Robert ...

  7. 游戏编程十年总结(上)

    自敲第一行代码起,已经十年多了,今天既不是十年整的日子,也不是一个有特定意义的日子,本来像这种大总结的文章,当择良辰吉日,斋戒沐浴三日,方可动笔.一开始计划是写一篇五年总结的,但各种原因一拖再拖,于是 ...

  8. 游戏编程十年总结(上)(转)

    游戏编程十年总结(上)(转) 一.总结 一句话总结:感觉作者是对游戏的喜爱,对编程的一腔热情,在资料极度匮乏的情况下保持非常好的学习热情,非常值得学习,从这个角度上来说,比之,我是不如的. 这样的故事 ...

  9. Unity实现:23种设计模式、《游戏编程模式》

    目录 一.23种设计模式在Unity实现 Creational Patterns 创建型模式(5种) 工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 Structural Patterns ...

最新文章

  1. File,FileInfo;Directory,DirectoyInfo的区别
  2. PIC单片机PIC18F26K80中断优先级图
  3. BUUCTF-WEB:[强网杯 2019]随便注 1
  4. wildfly-9.0.2 web项目部署详细步骤
  5. mysql 图片转为二进制_php 图片转为二进制数据的方法
  6. 现代企业,最好都是合伙人制度,都是股份制,全员持股最好
  7. 网站运营活动策划方案模板
  8. 编译器优化:何为SLP矢量化
  9. 如何做员工满意度调查问卷?
  10. 分子生物学中常用数据库
  11. 功夫熊猫里乌龟大师的一句名言
  12. 如何在Word中输入带方框对勾
  13. 微易聊社交电商三十讲:百家争鸣的社交电商格局
  14. 开源办公的五个法律问题 ——以“新型冠状病毒”防控期间企业在线远程运营为视角...
  15. 【街道可步行性】步行通达性对街区空间活力与交往的影响 | 上海城市规划
  16. php能抓抖音短视频教程,初学者必须要掌握的抖音短视频拍摄的小技巧
  17. timesten mysql_Timesten(TT)和ORACLE执行效率测试
  18. Java找出字符串中第一个不重复的字符
  19. GGS-DDU 【HDU - 4966】【最小树形图】
  20. 第一次链接出租房的宽带弹出上网公告

热门文章

  1. 中国电信计算机通信笔试题,中国电信入职考试题 求大神解答!
  2. 来说下华为专属分享功能——Huawei Share2.0
  3. 推荐一个在线编程学习网站“泡面吧”
  4. P2P担保的法律探析
  5. Final Cut Pro X 快捷键
  6. 刘汝佳蓝书后缀数组模板解释及补全
  7. CCNU ACM 2016夏季集训·day1比赛
  8. python 找出列表中出现最多的元素_利用Python找出序列中出现最多的元素示例代码...
  9. SwiftUI一日速成
  10. 小程序运营要善于做好活动推送