feat(pathfinding): 支持从不可行走位置开始寻路
改进寻路系统,允许玩家从不可行走的当前位置开始寻路到可行走区域。 当玩家位于不可行走位置时,系统会自动寻找最近的可行走位置作为起点, 并临时将起点设置为可行走状态以启动A*算法。 主要变更: - AStarPathfinding: 临时修改起点可行走状态以支持算法启动 - PlayerController: 检测玩家当前位置并自动传送到最近可行走点 - TiledMapPathfinder: 在寻路前验证起点并寻找替代位置
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user