植物大战僵尸全屏奶油

码农UP2U

共 5512字,需浏览 12分钟

 · 2023-05-07

早期文章


《植物大战僵尸》这个游戏中想让僵尸走慢一点,方法挺多的,可以使用冰冻豌豆射手,也可以使用玉米投手,也可以使用冰川菇。这里使用玉米投手的奶油,让僵尸走的慢些。

当僵尸走到离房子比较近的时候,让僵尸的头上顶一块奶油,站在那里。这样的话,需要判断僵尸的位置,还有就是如何让僵尸的头上顶一块奶油。

僵尸头上顶奶油,是僵尸的一个状态,这个状态在僵尸基址的 B0 偏移处。僵尸坐标的偏移在僵尸基址的 2C 处。

当僵尸离房子比较近时,让僵尸头上顶奶油,那么就需要判断僵尸的位置。通过分析,僵尸移动的指令在如下位置:

      
        0052AB25 - 74 09                 - je 0052AB30
      
      
        0052AB27 - D9 46 2C              - fld dword ptr [esi+2C]
      
      
        0052AB2A - D8 64 24 08           - fsub dword ptr [esp+08]
      
      
        0052AB2E - EB 07                 - jmp 0052AB37
      
      
        0052AB30 - D9 46 2C              - fld dword ptr [esi+2C]
      
      
        0052AB33 - D8 44 24 08           - fadd dword ptr [esp+08]
      
      
        0052AB37 - 83 7E 24 07           - cmp dword ptr [esi+24],07 { 7 }
      
      
        0052AB3B - D9 5E 2C              - fstp dword ptr [esi+2C]
      
      
        
          0052AB3E - 0F85 A4000000         - jne 0052ABE8
        
      
    

0052AB2A 地址用来将僵尸的坐标向左移动,我们想要增加判断,需要开辟一块内存写入判断的代码,当离房子比较近的时候,改变僵尸头顶奶油的状态即可。我这里找的是 00400F00 这个位置写入,因为这个地方空白区域比较多,容易发挥。首先,修改 0052AB3E 处的代码,修改为一条 jmp 指令。为什么选这条指令修改?原因比较简单,因为指令长度够,也就是把 jne 改为 jmp 后,不影响其他指令。如果修改上面的代码,那么修改一条指令会影响后面的多条指令,毕竟影响过的指令,我们是要手动补上的。修改后的代码如下:

      
        0052AB3E - E9 BD63EDFF           - jmp 00400F00
      
      
        0052AB43 - 90                    - nop
      
    

在 00400F00 写入判断和修改僵尸状态的代码,如下的代码:

      
        00400F00 - 60                    - pushad 
      
      
        00400F01 - 9C                    - pushfd 
      
      
        00400F02 - D9 46 2C              - fld dword ptr [esi+2C]
      
      
        00400F05 - C7 46 2C 56FB4843     - mov [esi+2C],4348FB56 { 200.98 }
      
      
        00400F0C - D8 56 2C              - fcom dword ptr [esi+2C]
      
      
        00400F0F - 9BDFE0                - wait:fstsw ax 
      
      
        00400F12 - 9E                    - sahf 
      
      
        00400F13 - 77 0A                 - ja 00400F1F
      
      
        00400F15 - C7 86 B0000000 00010000 - mov [esi+000000B0],00000100 { 256 }
      
      
        00400F1F - D9 5E 2C              - fstp dword ptr [esi+2C]
      
      
        00400F22 - 9D                    - popfd 
      
      
        00400F23 - 61                    - popad 
      
      
        00400F24 - 0F85 BE9C1200         - jne 0052ABE8
      
      
        
          00400F2A - E9 159C1200           - jmp 0052AB44
        
      
    

上面的代码中,当僵尸的坐标小于 200.98 时,让僵尸头顶奶油,这里的 200.98 是单精度浮点数,因此在内存中的值是 4348FB56。

代码不多,还是比较简单的,效果如下:

d3eaea71409cc0a342df8fa38ce1901a.webp

从上面的图中可以看出,僵尸走到红框的位置处头上都顶了奶油,并且站在那里不动了,而没有走到那里的僵尸,将会继续往前走,直到走到红框的位置处。

这样,全屏奶油的效果就达到了。

3a26a0f26c2b7f72301083bdb30dbe58.webp

公众号内回复 【mongo】 下载 SpringBoot 整合操作 MongoDB 的文档。

公众号内回复 【 cisp知识整理 】 下载 CISP 读书笔记。

公众号内 回复【java开发手册】获取《Java开发手册》黄山版。


浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报