1.使用二进制编辑器修改植物大战僵尸游戏数据&手动编码绘制bmp图片

本文详细介绍了如何修改植物大战僵尸游戏的数据,包括金币和关卡设置,以及如何手动编码将“永”字写入bmp图片,涉及BMP文件格式的解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、修改植物大战僵尸游戏数据

1、游戏数据存储位置

一般来说,经典版植物大战僵尸的游戏数据存储在C:\ProgramData\PopCap Games\PlantsVsZombies\userdata这个位置

据我观察,其中user1和user2是两份互不干扰的存档,game2_0是user2存档的上次游戏开始而尚未结束所产生的游戏数据。

2、修改数据

使用二进制编辑器(Hex Editor Neo)打开user1.dat文件,

打开后是以十六进制的形式显示数据,0x04字节的位置是关卡数据,0x08到0x0b四个字节是金币数据。

有四个字节控制金币数据,其实里面会有点问题,如果修改得太大,可能在游戏中会显示为负数,个人猜想是金币数据变量数据类型超出了能存储上线。那么其实有一点也有可能的就是0x04到0x07四个字节都是关卡数据相关,但是由于一次扫描的最小单位是4个字节,后面三个字节都是补的0。

经典版植物大战僵尸总共有5个章节,每个章节有10个关卡,如果我们希望将设定关卡到最后一关,也就是第50关,那么对应十六进制就是0x32,只需要将0x04的位置改为32,即可在游戏中显示level5-10,同时解锁商店、图鉴等附加玩法,并且多数植物和僵尸已经自动在图鉴中解锁。

接下来修改金币数据,当修改数据为0x01时,游戏中显示金币数量为10;当修改数据为0x0100时(对应十进制为256),游戏中显示金币数量为2560,因此其中存在一个10倍关系

至于“玩玩小游戏”,“解密模式”,“生存模式”的解锁,就是需要固定通过指定关卡,修改关卡数据至对应关卡并通过即可。

二、手动编码写一个“永”字到bmp图片

1、首先看看效果图

下面是编码,将以作为例子继续后文

2、bmp图片格式解析

bmp位图由四个部分组成,分别是文件头,信息头,颜色表和像素阵列,接下来一个个地聊

2.1、文件头(14字节)

  • 0x00~0x01两个字节:标识了这是一个.bmp文件
  • 0x02~0x05四个字节:表示图片的大小,即文件头+信息头+颜色表+像素阵列总大小

  • 0x06~0x09四个字节:保留,总为0
  • 0x0a~0x0d四个字节:位图数据距离文件起始的字节数,实际上就是文件头+信息头+颜色表的大小
2.2、信息头(40字节)

  • 0x0e~0x11四个字节:表示信息头大小
  • 0x12~0x15四个字节:表示位图宽度(单位为像素,上图实例宽高均为50px)
  • 0x16~0x19四个字节:表示位图高度。另外如果是正值,则说明该位图为倒向的;如果为负值,则说明该位图为正向。多数位图都是倒向的
  • 0x1a~0x1b两个字节:为目标设备说明颜色平面数,其值总为1
  • 0x1d~0x1d两个字节:表示位深度

 像素位深度是指每个像素所用的位数(bit),像素位深度决定了彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。例如,一幅彩色图像的每个像素用R、G、B三个分量来表示,若每个分量用8位,那么一个像素共用24位表示,就说像素的深度为24位,每个像素可以是224,即16777216〔千万级〕种颜色中的一种。在这个意义上, 往往把像素的位深度说成是图像深度。表示一个像素的位数越多,它能表达的颜色数目就越多, 而它的深度就越深。虽然像素位深度或图像深度可以很深,但由于设备本身的限制,加上人眼自身分辨率的局限,一般情况下,一味追求特别深的像素深度没有意义。因为,像素深度越深,数据量越大,所需要的传输带宽及存储空间就越大。相反,如果像素深度太浅,会影响图像的质量,图像看起来让人觉得很粗糙而不自然。

  • 0x1e~0x21四个字节:表示压缩方式,为0表示不压缩,也是最常用的方式

  • 0x22~0x25四个字节:表示像素阵列的大小
  • 0x26~0x29四个字节:表示水平分辨率,单位为像素/米
  • 0x2a~0x2d四个字节:表示垂直分辨率,单位为像素/米
  • 0x2e~0x31四个字节:说明该位图在颜色表中实际使用的颜色索引的数目,如果设为0,则表示使用颜色表的所有颜色表项,个人认为一般设为0就行
  • 0x32~0x35四个字节:说明对图像有重要影响的颜色索引的数目,如果设为0,则表示所有颜色都很重要
2.3、颜色表

颜色表可以看做是一个颜色的数组,其大小与位深度有关,1bit位图的颜色表有2个颜色(2x4=8字节),4bit位图的颜色表有16个颜色(16x4=64字节),8bit位图的颜色表有256个颜色(256x4=1024字节)。另外还可以有更大的位深度,如16bit、24bit等等,但是从16位开始就不使用颜色表了,转而在像素阵列中直接使用颜色的rgb值进行填充。

我在上述例子中采用4bit位深度,因而颜色表中有16个颜色。

在颜色表中,每个颜色表项为4个字节,由于rgb(红绿蓝三原色亮度)只需3个字节,因此每个颜色表项第四个字节都进行补充为0了

2.4、像素阵列

  • 每个字节都是前面颜色表中颜色的索引值,以此来填充该像素的颜色。
  • 每一行的字节数应为4的倍数,如果不够就需要补充,我为了看得方便点区分每一行,就补充了0x33。

在最后还需要整个文件的大小是4的倍数,再进行最后的字节补充(不算入像素阵列大小)

3、计算过程

首先想法是做一张宽高均为50像素,4bit位深度的bmp图片。

那么,文件头14B,信息头40B(0x28),颜色表:16(颜色数)*4(每个颜色表项占4字节)=64B。

在像素阵列中,每一行:(50*4bit) / 8 = 25B(每个像素4bit,一行有50个像素),发现25不是4的倍数,因此每行需要补3个字节,即每行28B,那么对于50行,像素阵列大小为:50*28=1400B(0x0578),此时再加上文件头、信息头、颜色表总大小:1400+14+40+64=1518B,1518也不是4的倍数,因此需要在最后面再补2B,即可使得图片总大小为1520B(0x05f0)。

感谢参考:

bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

BMP文件格式解析

位图数据 BMP图像基础概念

最后,如果文章中有错误,希望您能指出来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值