You need to enable JavaScript to run this app. p5.js类Agar.io程序AI互相追逐/逃跑时出现震动问题求助
优惠活动
大模型
产品
解决方案
定价
更多

p5.js类Agar.io程序AI互相追逐/逃跑时出现震动问题求助

p5.js Agar.io类小游戏AI追逐/逃跑震动问题排查及修复方案

已定位问题

  • 滞回逻辑未完全生效:逃跑逻辑使用了带滞回的Cpudist2[j]作为判断条件,但追逐逻辑没有使用预先计算的带滞回的Cpudist[j],而是直接判断敌方距离是否小于250,导致追逐状态在250像素临界值处频繁切换,引发震动。
  • 最近敌方索引匹配错误:计算最近敌方时,先对距离取整再匹配索引,当存在多个距离接近的敌方时,会出现帧间最近目标来回切换的情况,导致移动方向反复变动。
  • 移动无平滑过渡:每帧移动方向直接根据当前目标计算,没有插值过渡,方向突变时视觉上表现为震动。
  • CPU遍历存在潜在bug:遍历CPU数组时为正序遍历,当发生吞噬调用splice删除元素后,会跳过后续未遍历的CPU单元。

修复方案

  • 修正追逐判断逻辑:将原有追逐判断条件
else if (dist(cpu[ClosestCpupos*4],cpu[ClosestCpupos*4+1],cpu[j*4],cpu[j*4+1])<250&&cpu[ClosestCpupos*4+2]<cpu[j*4+2])

替换为

else if (Cpudist[j])

确保追逐逻辑也应用200像素触发、250像素退出的滞回规则,避免状态频繁切换。

  • 优化最近目标计算逻辑:存储敌方距离时同步存储对应索引,避免取整匹配错误:
// 原有cpuDist.push(distant)替换为
cpuDist.push({dist: distant, index: m})
// 找最近目标时直接取距离最小的项
let closestCpuItem = cpuDist.reduce((prev, curr) => prev.dist < curr.dist ? prev : curr)
let ClosestCpupos = closestCpuItem.index
  • 增加移动平滑处理:为每个CPU单元额外存储上一帧的移动速度分量,每帧新计算的移动分量用插值过渡:
// 初始化时增加vx、vy数组存储每个AI的移动速度
// 计算完当前帧目标移动分量newVx、newVy后
cpuVx[j] = lerp(cpuVx[j], newVx, 0.15)
cpuVy[j] = lerp(cpuVy[j], newVy, 0.15)
cpu[j*4] += cpuVx[j] * amp
cpu[j*4+1] += cpuVy[j] * amp
  • 改为倒序遍历CPU数组:
for (let j = Math.floor(cpu.length / 4) - 1; j >= 0; j--)

避免splice删除元素后出现索引偏移漏遍历的问题。

内容的提问来源于stack exchange,提问作者user15302406

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 23:06:03