第六章,BITObject与PlaneObject

        读到本章前,读者或许会有一些疑惑:笔者将实体描述得很玄乎,可以构成游戏世界的基础,却丝毫没有提及到资源的应用。一个游戏能够离开图片资源而存在吗?答案是,当然不能。本文将介绍在ShinyNova中图片资源如何与实体结合工作

      PObject是一个纯粹的逻辑概念,仅能描述物体的性状而不包含任何资源信息,因此PObject本身是不可见的。BITObject与PlaneObject是PObject最重要的两个派生类,可以接受资源信息,并将其显示出来。

      BITObject是图片引用实体,它能够显示内存中已经加载的图片资源,但不能对之进行更改,通常如下:

 

      BITObject* bitObject;

      SNG_PIC pic;       //SNG_PIC是ShinyNova定制的图片描述结构,后章会有详细描述。

      bitObject->LoadPic(pic);

 

     BITObject的优点是大量重复使用时内存占用小,因为呈现同一张图片的多个BITObject指向的是同一段资源内存。缺点也很明显,就是无法修改图片内容,仅能调节显示的部位,大小和帧数。BITObject最常使用的函数是:

 

     DWORD  GoToFrame(WORD index);         //跳到第几帧,返回该帧延迟
     DWORD  GoToFrameByLifeTime(DWORD time);      //根据生存时间计算当前帧数
     DWORD  GoToNextFrame();

    DWORD  GetDelay(WORD index);         //获取第几帧的延迟,返回该帧延迟

 

    当BITObject加载了一个多帧图片时,可以使用该函数组来切换显示帧,这是ShinyNova引擎播放动画的基础。

 

    PlaneObject是资源定制实体,它向系统申请指定大小的内存,并将该段内存代表的内容显示到屏幕上。PlaneObject的优点是像素级定制,其申请的空间必须是矩形,而该矩形上任意一个点的颜色分量,ALPHA值都可以由程序员指定。缺点是内存占用量相对较大,每一个像素需要占用4BTYE(B,G,R,A),内容重复的PlaneObject也需要申请相同大小的内存。PlaneObject同样可以通过void DrawPic(SNG_PIC& pic)函数显示已经加载到内存中的外部图片资源,其原理是将外部资源画到PlaneObject申请的这段内存中,但PlaneObject中不存在图片帧概念,如果想使用PlaneObject动态显示多帧图片,必须多次使用void DrawPic(SNG_PIC& pic)重绘。

    PlaneObject非常重要的作用是文字书写。使用GDI开发时如果要在屏幕上显示文字,我们通常是调用TextOut直接画到背景CDC上。但在ShinyNova中,任何资源必须由实体来承载(桌面背景固然可以定制修改,但意味着必然位于画面的最底层)。而文字的承载实体只能是PlaneObject,相关函数如下:

 

  virtual     void  SetTextColor(UINT color);
  virtual     void  SetTextSize(int size,int weight=400,char *FontType="宋体");
  virtual     void  SetSpace(int character,int row);
  virtual     void  SetItatic(BOOL bnItalic);
  virtual     void  SetUnderLine(BOOL bnUnderLine);
  virtual     void  SetBesideLine(int leftline,int rightline);//设置边距  |lefline<正文>rightline|,注意是到左右边的距离
  virtual     void  SetFontInfo(FONTINFO& font);
  virtual     void  TextOut(int x,int y,LPCTSTR str);//以文字左上方为基准
  virtual     void  TextOutEx(int x,int y,LPCTSTR str);//以文字中心为中心
  virtual     void  AutoText(LPCTSTR str,int size=0,int leftline=0,int upline=0);

 

   需要注意的是,TextOut与TextOutEx函数中的坐标是相对于PlaneObject左上角的坐标。

   PlaneObject使用杨红(RGB(255,0,255))作为透明色,即如果该像素的颜色为杨红,那么该点是透明的。善用PlaneObject可以实现很多特殊的效果,如实现半透明膜,使背景颜色反转,色彩过滤等。如想实现更高级的PlaneObject应用,可以使用BYTE* GetPlaneData()获取实体所申请的内存。一个宽3像素高4像素的图片排列结构如下:

           B G R A B G R A B G R A

           B G R A B G R A B G R A

           B G R A B G R A B G R A

           B G R A B G R A B G R A

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值