寻找路径避免软碰撞

Find path avoid soft collisions

我有 x,y 仪表板 10x10。我有一组目的地 x,y,我需要从中找到最近的目的地及其路径。

我还有一组软碰撞和一组装饰​​碰撞。

我正在使用寻路包来寻找路径。我正在像这样设置装饰碰撞:

//set collisions
for(let i = 0; i < mapData.collisions.length; i++) {
    grid.setWalkableAt(mapData.collisions[i].x, mapData.collisions[i].y, false);
}

我正在寻找实际最近的坐标及其路径,如下所示:

//find actual closest coordinate and its path
for(let i = 0; i < destinationCoords.length; i++) {
    currentGrid = grid.clone();
    currentPath = finder.findPath(heroCoords.x, heroCoords.y, destinationCoords[i].x, destinationCoords[i].y, currentGrid);

    if(currentPath && currentPath.length !== 0 && currentPath.length < closestPathLength) {
        closestPathLength = currentPath.length;
        closestPath = currentPath;
        closestCoords = destinationCoords[i];
    }
}

现在的问题是,如果我有以下仪表板:

其中黄色是起点,绿色是终点,粉色是软碰撞,它只会穿过粉色瓷砖。

但我想达到的是避免软碰撞。所以路径是:

但是当没有其他选择时,路径将是:

有什么想法吗?

似乎合适的策略是两次 运行 两次通过:

1) 将永久碰撞和软碰撞都标记为不可行走。

2) 如果没有解决方案,则仅将永久碰撞标记为不可行走。

如果仍然没有解决方案,则没有可走的路。