feat(pathfinding): 支持从不可行走位置开始寻路

改进寻路系统,允许玩家从不可行走的当前位置开始寻路到可行走区域。
当玩家位于不可行走位置时,系统会自动寻找最近的可行走位置作为起点,
并临时将起点设置为可行走状态以启动A*算法。

主要变更:
- AStarPathfinding: 临时修改起点可行走状态以支持算法启动
- PlayerController: 检测玩家当前位置并自动传送到最近可行走点
- TiledMapPathfinder: 在寻路前验证起点并寻找替代位置
This commit is contained in:
richarjiang
2025-10-20 09:23:04 +08:00
parent 8f4200a7a3
commit 972334f786
3 changed files with 46 additions and 4 deletions

View File

@@ -111,11 +111,23 @@ export class TiledMapPathfinder extends Component {
}
// 将世界坐标转换为瓦片坐标
const startTilePos = this.worldToTileCoordinate(startWorldPos);
let startTilePos = this.worldToTileCoordinate(startWorldPos);
const targetTilePos = this.worldToTileCoordinate(targetWorldPos);
console.log(`寻路: 起点瓦片坐标(${startTilePos.x}, ${startTilePos.y}) -> 终点瓦片坐标(${targetTilePos.x}, ${targetTilePos.y})`);
// 检查起点是否可行走,如果不可行走则寻找最近的可行走位置
if (!this.pathfinding.isWalkable(startTilePos.x, startTilePos.y)) {
console.log('起点不可行走,寻找最近的可行走位置');
const closestWalkableWorldPos = this.getClosestWalkablePosition(startWorldPos);
if (!closestWalkableWorldPos) {
console.warn('找不到起点附近的可行走位置');
return [];
}
startTilePos = this.worldToTileCoordinate(closestWalkableWorldPos);
console.log(`使用新的起点瓦片坐标(${startTilePos.x}, ${startTilePos.y})`);
}
// 使用A*算法寻找路径
const tilePath = this.pathfinding.findPath(
startTilePos.x, startTilePos.y,