第九章,PPS图片格式与SNG_PIC结构

      对于2D游戏引擎来说,如何储存和使用图片是非常关键的问题。我们首先分析一下当前市面上通用图片格式的优缺点,主要考虑以下几点:是否支持透明,是否支持半透明,是否支持调色板,是否支持多帧格式,储存空间占用。

    

    bmp    支持调色板,储存空间大

    png     支持透明,支持半透明,储存空间小

    gif       支持透明,支持多帧,支持调色板,储存空间小

 

      从游戏开发程序员的角度来说,我们希望图片本身包含的信息足够多,这样有利于将细节调节等琐碎的工作交给真正的决策者----美工与策划来完成。相信不少程序员都碰到过这样的悲剧:“策划说,这个动画应该播放得更慢一点。美工说,这个图片应该向右移动一点,但最后,但最后动手把几个数字改来改去的全是毫无意见的程序员。”

     

      正是为了对游戏开发提供最多便利及实现谁决策谁动手的游戏开发思想。ShinyNova采用了独立设计的图片格式PPS,开发者可以通过配套工具GameSupportSystem将当前市面上支持的21种通用图片格式转换为PPS格式,并实现动画组装和拆分(同样可以使用GameSupportSystem将PPS格式转回通用格式,但目标格式所不支持的属性将被丢弃,如将多帧PPS转回png格式时将只有第一帧)。

       PPS格式内置压缩算法对数据进行压缩和解压,开发者无须关注,被加载到内存中后会展开为HBITRES结构如下:

 

                 typedef struct _tagHBITRES
                 {
                         DWORD        ResID;                //资源ID
                          WORD         width;                //帧宽度
                          WORD         height;               //帧高度
                          BYTE*        Bits;                 //位图缓存
                          DWORD        BitsCount;            //总长度
                          UINT         crTransparent;        //透明色(透明序号)
                             WORD         nPlane;               //多少帧
                          DWORD        dwExtend;             //扩展
                          PRGB*        rgb;                  //调色板
                          WORD         quadlenth;            //调色板位数
                          DWORD*       delay;                //帧延迟
                         ///扩展
                             short         nBaseX;               //基准点相对于图片中心的位差
                          short         nBaseY;               //基准点相对于图片中心的位差
                  }HBITRES,*LPHBITRES;

 

         

      HBITRES结构是ShinyNova描述图片的基本形式,任何格式的图片都可以被转换为HBITRES结构后,在ShinyNova中显示出来。需要注意的是HBITRES是对资源的描述,禁止直接修改,否则会造成很严重的显示错误乃至进程崩溃。对图片的逻辑描述由结构SNG_PIC完成,用户通过修改此结构参数完成对图片的调用:

 

     SNG_PIC pic=Res_GetPICStruct("picname");//从资源列表中取出名为picname的图片,并获得了一个默认的SNG_PIC描述

     pic.nFrame=3;//显示第3帧

     pic.x=10;

     pic.y=10;

     pic.width=30;

     pic.height=40;

     BITObject*  bit;

     bit->LoadPic(pic);

    

    上例使得位图引用实体bit,显示了picname图片第三帧从左上角(10,10)开始宽30像素,高40像素的区域,实际使用通常无须这么多语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值