守望工坊|安娜:生物手雷的定点投掷

背景

    假期的我总是无法专心地学习,碌碌无为的日子里会玩一些游戏,譬如守望先锋。作为一名鱼塘(1.8k-2.1k)的辅助玩家,我总是希望能在喜爱的辅助中选择贡献更多的一位。安娜,可爱的人设、独特的机制、复杂情景下的适应力吸引了我,成为了我最常用的辅助角色。

    在最近的一次复盘中,我第一次见到了定点瓶的用法。好奇的我花费了数小时的时间为每张攻防地图寻找了合适的点位,这是一个繁琐又乏味的过程。坐标、角度、参照物的不确定性的叠加让我感到不安,那晚我用被子将自己包裹得严严实实,只是因为这种情绪强化了我在寻找点位时环境的声音带来的恐惧。糟糕的经历令我产生了通过地图工坊减少一些不确定因素的想法,于是有了这篇文章。

概览

    概括地说,在确定出发点与落点后,工坊的代码会为我们找到投掷的角度。工坊代码:Y2YRE

基本用法

  1. 按下Q将当前位置设为落点
  2. 移动到安全区域后,按下SHIFT唤出并瞄准指示器。
  3. 投掷生物手雷,该手雷在不被阻挡的情况下一定会坠至落点

辅助功能

  • 通过左键快速传送,以便放置点位,同时也能借此上高台。
  • 按住F可以暂时将镜头移至落点,以便观察生物手雷的轨迹。镜头的角度于设置落点时确定。
  • 唤出指示器后,代码将预测并报告生物手雷的滞空时间。

演示视频

设计思路

验证抛物线猜想

  出于生活的惯性思维,我猜想生物手雷的轨迹是一段抛物线,于是尝试验证。验证的过程需要两个参数:投掷速度(\(v_0\))、重力加速度(\(g\))。我尝试了最简单直观,且在这次尝试中取得了成功的方式:测量。

  • 投掷速度:竖直上抛,时间、重力、初速度三者满足:\(gt=2v_0\)
  • 重力加速度:在国王大道A点三楼记录高度与自由落体的滞空时间,满足:\(h=\frac{1}{2}gt^2\)

  至此,\(v_0\)\(g\)成为已知量。之后我设计了一个demo,在投掷手雷的同时绘制从玩家朝向出发,初速度为\(v_0\),加速度为\(g\)的抛物线。得到的结果为抛物线与生物手雷轨迹几乎完全吻合,猜想成立。

导出投掷角度

  已知投掷角度的情况下绘制轨迹是非常直观且简单的,但我们的任务是通过起点、落点、初速度求出投掷角度。虽然用到的都是初等数学知识,但后者显然繁杂许多。根据物理与数学的知识,列出等式,联立求解。虽然过程中犯了许多错,但最终得到了正确答案。

deduce_vx_vy

下载pdf格式:链接:https://pan.baidu.com/s/1TJ5c-QSZGYHvmA0NPQLtBQ 提取码:meow

导出滞空时间

  事实上在导出投掷角度的中间步骤中我们已经求出了所需的两段时间\(t_s\)\(t_d\)。但是在实现的过程中我们已经将它们消除,只需将等式单独提出独立实现一份即可。

  在已经求出\(v_y\)的情况下,滞空时间的计算更加简单。将抛物线的运动分为两部分:

  1. 从起点到最高点
  2. 从最高点到落点

  这两部分均可视作自由落体运动,对于前一段我们已知最大速度:\(t_s=\frac{v_y}{g}\);对于后一段我们已知竖直方向上的位移:\(t=\sqrt{\frac{2(h_S+h)}{g}}\),其中\(h_s=\frac{1}{2}gt_s^2\)\(h\)为起点与落点在竖直方向上的高度差。

确认一致性

  注意到在导出投掷角度的过程存在对二次式的分类讨论,但实现的过程中该过程被消去。不难验证,这个算法的正确性不依赖起点与落点的高低关系。

实现

克服精度问题

  实践出真知,将设计转化为产品的过程总需克服一些困难。地图工坊的数字在\(x\)正半轴的表示范围为\([10^8, 10^{-3}]\)。但在测试时发现在对一般规模的输入参数进行运算的过程中,部分中间值远大于\(10^8\) 。为了能够得到正确答案,我尝试将所有的中间值乘以\(10^{-4}\),将小数位利用起来。同时由于在玩家尺度下,\(0.1\)米的误差是可以接受的,我们乘以\(10^{-4}\)而不是\(10^{-3}\)。最终我们的代码满足了一般尺度下的求解需求。

优化传送的穿模问题

  通过射线命中位置命令,我们可以得到玩家瞄准的目标坐标。但是直接将玩家传送到该坐标是及其不负责的,玩家有可能因穿模传送到墙体后方、掉入地底、卡到黑色区域中丢失视野。尝试了两种解决方案,各有优势,最终选择了第二种。

序号 方案 优点 缺点
1 添加最近的可行走位置限制 玩家不会被传送到墙体内或地下 无法上高台,低概率穿墙
2 通过射线命中法线修正传送点 传送的位置精确符合玩家预期。 极低概率穿墙

结语

  算作一次简单的尝试吧,非常讨厌不确定因素带来的不安,完成工坊后心情舒畅了许多。也希望这个工坊能够对其他的辅助玩家有所帮助。这个博客还在建设中,代码块仍没有实现折叠功能,所以暂时不将冗长的代码贴在这里了。游戏中可以直接查看代码,感兴趣的小伙伴可以自行查看。希望接下来的八月我能够更积极向上一些,你也是。

猜你喜欢

转载自www.cnblogs.com/yuiko/p/ana_parabola.html