红色警戒2中的SHP文件数据结构
养猫的程序员
编辑于 2025年05月17日 08:06
收录于文集
共2篇

建议先去看我的视频投稿,演示红警动画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文件我们将可以用程序来展示为动画信息

后续讲解内容

讲解数据区时说到了一个“像素颜色下标”的概念,这个是什么?

是调色盘中的下标,通过下标在调色盘文件中可以找到对应的颜色,后续再细讲