feat: 完成寻路系统接口设计

This commit is contained in:
unanmed 2026-09-09 16:40:56 +08:00
parent 67c0806f7f
commit 7a011b29c2
3 changed files with 157 additions and 12 deletions

View File

@ -13,6 +13,7 @@ import {
IObjectMover,
ISaveableContent
} from '@user/data-common';
import { IPassPredicate } from '../map';
//#region 勇士属性
@ -300,6 +301,11 @@ export interface IHeroMoveTopHandler extends IDataCommonExtended {
}
export interface IHeroMoveTopImpl {
/**
* 获取用于检查通行性的谓词对象
*/
predicate(): IPassPredicate;
/**
* 检查目标位置是否在地图范围内
* @param x 横坐标
@ -308,18 +314,6 @@ export interface IHeroMoveTopImpl {
*/
inBound(x: number, y: number, floorId: string | undefined): boolean;
/**
* 判断在指定楼层中,从指定坐标向指定方向移动一格是否可通行
* @param handler 通行性检查对象
*/
canPass(handler: IHeroMoveTopHandler): boolean;
/**
* 判断在指定楼层中,从指定坐标向指定方向移动时是否应该产生撞击,撞击将会触发目标位置的撞击触发器
* @param handler 通行性检查对象
*/
shouldHit(handler: IHeroMoveTopHandler): boolean;
/**
* 勇士正常移动到某个图块上时触发进入触发器
* @param handler 移动信息对象

View File

@ -889,3 +889,32 @@ export interface IMapState
}
//#endregion
//#region 通行检测
export interface IPassCheckHandler extends IDataCommonExtended {
/** 当前位置 */
readonly currLoc: ITileLocator;
/** 要移动至的位置 */
readonly nextLoc: ITileLocator;
/** 移动方向 */
readonly direction: FaceDirection;
/** 当前楼层 id */
readonly floorId: string | undefined;
}
export interface IPassPredicate {
/**
* 检查在指定楼层中,能否从某一个移动入某一格
* @param handler 通行性检查信息对象
*/
canPass(handler: IPassCheckHandler): boolean;
/**
* 检查在指定楼层中,从某一个移动至某一格时是否会产生撞击行为
* @param handler 通行性检查信息对象
*/
shouldHit(handler: IPassCheckHandler): boolean;
}
//#endregion

View File

@ -0,0 +1,122 @@
import { ITileLocator } from '@motajs/common';
import {
IDataBaseExtended,
ILayerLocation,
IMapLayer,
IMapState,
IPassPredicate
} from '@user/data-base';
import {
FaceDirection,
IMoverController,
IObjectMovable
} from '@user/data-common';
export interface IPathfindingStep {
/** 移动方向 */
readonly dir: FaceDirection;
/** 这一步的出发位置 */
readonly from: Readonly<ITileLocator>;
/** 这一步移动到的位置 */
readonly to: Readonly<ITileLocator>;
}
export interface IPathfindingController {
/** 移动控制器对象 */
readonly controller: Readonly<IMoverController>;
/** 寻路路径 */
readonly path: readonly IPathfindingStep[];
}
/**
* 寻路损失函数,损失值仅与指定位置的图块有关,与移动方式等无关
* @param block 指定坐标的位置信息
*/
export type PathCostFunction = (block: ILayerLocation) => number;
/**
* 瞬移回退策略函数,若返回 `true`,表示当前操作不允许瞬移,必须逐步寻路
* @param path 完整路径列表
*/
export type PathFallbackPolicy = (path: readonly IPathfindingStep[]) => boolean;
export interface IPathfinder extends IDataBaseExtended {
/**
* 绑定寻路所用的地图状态对象,用于获取楼层与事件层信息,未绑定时寻路告警并返回空路径
* @param maps 地图状态对象
*/
useMapState(maps: IMapState | null): void;
/**
* 绑定构建有向图所用的地图图层,通常绑定事件层
* @param layer 地图图层对象
*/
useMapLayer(layer: IMapLayer | null): void;
/**
* 设置自定义损失函数,默认每格损失 1
* @param cost 损失函数
*/
useCostFunction(cost: PathCostFunction | null): void;
/**
* 设置通行性谓词,用于通行性判断,默认均不可通行
* @param predicate 通行性谓词
*/
usePassPredicate(predicate: IPassPredicate | null): void;
/**
* 设置寻路使用的朝向组
* @param group 朝向组
*/
useDirGroup(group: number): void;
/**
* 在当前状态下执行寻路操作
* @param start 寻路起始位置
* @param target 寻路目标位置
*/
find(start: ITileLocator, target: ITileLocator): IPathfindingStep[];
}
export interface IPathfindingSystem extends IDataBaseExtended {
/** 寻路求解器 */
readonly finder: IPathfinder;
/**
* 绑定寻路移动对象,可绑定勇士位置或任意 `IObjectMovable`,如动态图块
* @param movable 移动对象
*/
useMovable(movable: IObjectMovable | null): void;
/**
* 设置瞬移回退策略,默认必定回退为逐步寻路
* @param policy 回退策略函数
*/
useFallbackPolicy(policy: PathFallbackPolicy | null): void;
/**
* 仅获取从当前位置至目标位置的最小损失路径,不产生任何移动
* @param target 目标坐标
*/
getPath(target: ITileLocator): IPathfindingStep[];
/**
* 逐步寻路至目标位置,触发途经事件
* @param target 目标坐标
* @returns 移动控制器。无法寻路、无路径或已有移动进行中时返回 `null`
*/
moveTo(target: ITileLocator): IPathfindingController;
/**
* 瞬移至目标位置。瞬移前经回退策略判定,判定需要回退则自动退为逐步寻路
* @param target 目标坐标
* @returns 移动控制器;无法寻路、无路径或已有移动进行中时返回 `null`
*/
teleportTo(target: ITileLocator): IPathfindingController;
/**
* 打断当前自动寻路。新的方向输入或新的寻路调用可随时打断并接管
*/
interrupt(): Promise<void>;
}