本系列文章将选择IZ(E)中不那么为人所知的有趣细节,介绍涉及的游戏机制,揭示“玄学”背后的原理。对于自制IZ玩家和生存无尽玩家,也可以从中获取灵感避免重复发明轮子;对于珍珑作者,下届智商杯说不定就押题了呢!
【资料图】
保证通俗易懂,无须任何代码知识,有基本游戏常识即可顺利阅读。如有不严谨之处,恳请各位大佬指正。
特性演示
上面的动画展示了传说中的“矿工‘剐蹭’磁力菇”奇观:矿工在植物的左侧位置出土后,明明没有开啃直接往前走了,为什么磁力菇的血量会变少呢?
类似的现象有不少,仅再举一例:https://tieba.baidu.com/p/8193145084 此帖介绍了类似的“豚过拔毛”现象,其原理完全相同。
原理解释
本例仅涉及僵尸行走和啃食的更新顺序,比较简单。
首先要知道,在游戏中僵尸的坐标以浮点数(即小数)的方式存储,但啃食判定时用的是下取整后的结果。如果按这个整数计算出僵尸的攻击区域与植物的防御区域重合,就判定啃食。
游戏每一帧中僵尸的更新逻辑,极简描述如下:
把僵尸的整数横坐标 x存储在临时变量 tx中;
若僵尸不在啃食,则向前走一步(更新僵尸横坐标 x);
若僵尸能啃食*,用 tx 计算僵尸的攻击区域,判定是否啃食,并开始或结束啃食。
*聪明的读者马上意识到问题所在:你第2步更新了横坐标 x,但 tx 没变啊!你第3步用 tx 判断要不要啃食,这时的 tx 已经是上一帧的横坐标了,那肯定就不对了。宝开你怎么这么愚蠢呢!
具体到本例中,矿工出土的位置恰到好处,刚好能啃到植物,但只要往前走一帧就离开了啃食范围。这样,在出土后的第一帧,先在步骤2时向前走一步越出啃食范围,但在步骤3时还拿原来的横坐标判断,结果是啃食一口。第二帧,由于之前向前走了一步,已经啃不到植物,就不再啃第二口而直接向前走了。
这样的结果是,磁力菇恰好在矿工出土后的第一帧被啃掉4滴血。
真理往往是简单的。当你发现它后,会大呼宝开SB。 ——渐强
本来想讲裂荚对伴舞暴击,想着第一次别搞太劝退,就找了个简单的,伴舞的下次再说(
致谢:感谢该特性的发现者(某智慧群友);感谢CVP的开发者零度、ShowMe的开发者向量、IZT的开发者,以及BUG的开发者宝开程序员。