
建议先去看我的视频投稿,演示红警动画Demo
讲解之前,先解决一些前置问题,避免有些人不明就里
1.红警的SHP文件是什么?
红警的SHP文件是一种动画资源文件,类似Gif动图,红警的建筑、人物、基地等动画资源,都是以SHP文件作为基础的。它是一种二进制文件
2.怎样获取红警的SHP文件?
下载XCC Mixer工具,从红警安装目录中的ra2.mix文件中提取出(只要你获取了这个工具和ra2.mix文件,自然就能学会提取)
3.分析红警的SHP文件数据结构有什么用?
了解红警SHP文件数据结构后才能使用红警的建筑、人物等动画资源进行编程,就像我的视频里一样
以核弹发射井的建造动画文件为例讲解数据结构,尽量简洁
1.SHP文件数据的组成
文件头、若干个帧头、若干个数据行组成
2.文件头数据结构
00-01字节,无意义
02-03字节,图片宽度,0xEE表示图片宽度238像素
04-05字节,图片高度,0xCA表示图片高度202像素
06-07字节,动画总帧数,0x34表示共有52帧


3.帧头数据结构
00-01字节,表示此帧存在颜色信息的像素的最小X坐标,值为0x58表示88,注意坐标是从0开始的,所有坐标的范围是0到237
02-03字节,表示此帧存在颜色信息的像素的最小Y坐标,值为0x7F表示127,同样注意坐标是从0开始的,所有坐标的范围是0到201
04-05字节,表示此帧的有效区域宽度,值为0x3E表示62,也就是最小X坐标到最大X坐标间的像素个数
06-07字节,表示此帧的有效区域高度,值为0x03表示35,也就是最小Y坐标到最大Y坐标间的像素个数,
08-11字节,表示此帧的帧类型,目前已发现的有00,01和03两种值,数据区解析时会用到这个值
01、00较少见,一般用于帧中像素个数很少的情况
03为常见值
12-15字节,我并未破译出其中含义,猜测可能是一个校验值,如果有谁知道其含义,还请告知UP主,但是这个字节并不影响我们使用shp文件
16-19字节,表示分隔符,值均为0x0,没有实际含义
20-23字节,表示此帧画面的数
据区数据在文件中的第一个下标,核弹井的值是0x04E8表示下标为1256的字节是这帧数据的第一个字节,即这个0x07的位置



4.数据区数据结构
帧头数据和数据区数据是一一对应的
帧类型为00或01时,数据区的数据全是颜色下标。帧头中已经确定了最小XY坐标,有效区域高度h宽度w,那么h*w个字节的数据全是颜色下标数据
当帧类型为03时,首先先判断前2个字节值是否为0x4,如果是表示此行没有数据,需要跳过下两个字节;
如果不是04,为了方便解读,看核弹井的例子
前两个字节是0x07表示此行有7个字节,第3个字节00表示此行像素最小X坐标值不是帧像素X坐标最小值,第4个字节0x19表示第一个像素X坐标大于帧最小X坐标25个像素,第5个字节0x0A表示颜色下标,第6个字节00表示此行像素最大X坐标值不是帧像素X坐标最大值,第7个字节0x25表示最后一个像素X坐标小于帧最大X坐标36个像素 36=0x25-0x1,就是这么设计的
我们简称这个模式叫做 2+2+N+2模式,表示2个字节表示行字节长度,2个字节表示起始位置,N个字节表示像素颜色下标,2个字节表示末尾位置
另外还有 2+N+2模式表示第一个像素的X坐标是帧像素X最小值,2+2+N模式表示最后一个像素的X坐标是帧像素X最大值,还有2+N模式表示行X最小值等于帧X最小值且行X最大值等于帧X最大值
另外还有一种特殊情况,当行的中间出现像素值0,看起来行中间被"挖空"了,0的下一个值将表示此处有几个空像素,而这个值将不表示颜色值
当一帧的数据区数据解析完之后,需要补齐8位,补若干个0使当前的数据整齐,这在一些旧的系统或者文件中也常见



如果理解了上述我描述的规则信息,SHP文件我们将可以用程序来展示为动画信息
后续讲解内容
讲解数据区时说到了一个“像素颜色下标”的概念,这个是什么?
是调色盘中的下标,通过下标在调色盘文件中可以找到对应的颜色,后续再细讲

