对于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像素的区域,实际使用通常无须这么多语句。