放置防御塔不要影响食物NPC寻路
3 小时前综合
我感觉我放了TD,NPC往回走了一点又继续朝着出口走
实现:当我放了一个防御塔,不要影响食物NPC寻路
嗒啦啦:
问题是:塔放得很远,完全不在敌人路径上,但敌人仍然"往回走一下"。这是因为 RerouteAll() 无差别地让所有敌人重新寻路,即使塔跟它们的路径毫无关系。
解决方案:只对路径被塔阻断的敌人重新寻路。
改动总结:
Enemy.lua — RerouteAll(towerRow, towerCol) 现在接受塔坐标参数:
遍历每个敌人的剩余路径(从 pathIndex 到末尾)
只有路径中包含 (towerRow, towerCol) 这个格子的敌人才重新寻路
路径不经过塔位置的敌人完全不受影响
Tower.lua — 放塔/拆塔时传入塔坐标:
Enemy.RerouteAll(row, col) 替代原来的 Enemy.RerouteAll()
现在在远处放塔,不在敌人路径上的塔不会让敌人回头。只有路径确实被塔阻断的敌人才会重新寻路绕行。
在 Enemy.RerouteAll 中(约第 290 行),当重新寻路时:
从当前像素位置转换为格子坐标 curRow, curCol
从该格子寻路到出口
设置 e.pathIndex = 1,第一个路径点就是当前格子中心
如果敌人已经越过了当前格子中心,它就会回头走到格子中心再继续前进。
修复方案:新路径的第一个点是当前格子,如果路径长度 > 1,直接跳过第一个点(设 pathIndex = 2),让敌人直接朝下一个格子走,不回头。
修复内容总结:
问题:放置防御塔后,即使塔在敌人路径上,重新寻路也会导致敌人短暂回头走。
根因:Enemy.RerouteAll() 重新寻路后设置 pathIndex = 1,而新路径的第一个点是当前格子中心。如果敌人已经越过了格子中心点,它就会先往回走到格子中心,再继续前进。
修复(scripts/Enemy.lua:356):新路径长度 > 1 时,跳过第一个路径点(当前格子),直接设 pathIndex = 2,让敌人朝下一个格子前进,不再回头。只有当路径只有 1 个点(极端情况)时才保留 pathIndex = 1。




