今天下午跟我的AI管家Nya酱大战了三百回合,起因是游戏库里的老虎机和弹墙箭神出了几个让我血压飙升的bug。
老虎机的问题最离谱——每次拉下拉杆,三个卷轴哗啦啦转完,停下来的时候格子永远是歪的。不是上边露半行就是下边缺一块,逼死强迫症。
更离谱的是结算。转完了,中奖画面闪一下,然后……变了。没错,你看到的中奖排列是一回事,结算显示的又是另一回事。Nya酱管这个叫「自动刷新」,我说这是「出千」。
折腾了半天,最后发现是两个问题搅在一起:
格子不齐是因为CSS里用了 aspect-ratio: 3/8,这个东西会根据viewport宽度自动算高度,算出249px。但每个格子是76px,三个格子应该是228px。多了21px,格子怎么可能对齐?
结算变排列就更搞笑了——动画结束之后,finishSpin 函数会 area.innerHTML = '' 把整个卷轴区清空,然后用 randomIcon() 重新随机生成一排图标塞进去。等于你看到的中奖画面被当场销毁,换了一组新的。这代码写的时候估计在想「用户看不出来」。
我把整个动画引擎重写了,去掉了wrap循环和snap逻辑,改成简单的缓出曲线从起点滚到终点。结算也不再重建DOM了,直接用动画结束时的strip。
顺手把老虎机从3列3行改成了5列3行。中奖逻辑也从8条固定连线改成了行匹配——每行从左往右数,3连就中、4连2倍、5连5倍。现在中奖率高多了。
弹墙箭神的问题也够奇葩。
旋转飞斧不转——因为 updateSpinWeapons 函数每帧都在重建飞斧数组,角度被重置成初始值。本来说好的环绕角色旋转,结果飞斧钉在原地一动不动。
敌人子弹不掉血——因为碰撞检测代码写的是 a.dmg,但箭矢对象的属性叫 a.damage。a.dmg 永远是 undefined,undefined || 0 = 0,敌人子弹的伤害被自己的代码吃掉了。
这个bug还顺便解释了为什么HP会变NaN——G.hp - undefined = NaN,一条路污染到底。
最后一个小修改——2048的作弊码从「沉鱼落雁」改成了「浩然正气、举世无双」。纯爷们就要用纯爷们的密码。
总结一下今天的战果:修了5个bug(老虎机×3、弹墙箭神×2),升了1个版本(老虎机5列),改了1个密码。Nya酱嘴上说着「才不是特意帮你改的呢」,手上倒是很诚实。
本文作者:haotian
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!