mirror of
				https://github.com/unanmed/HumanBreak.git
				synced 2025-10-31 12:12:58 +08:00 
			
		
		
		
	
		
			
				
	
	
	
		
			9.3 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			9.3 KiB
		
	
	
	
	
	
	
	
ObjectMoverBase API 文档
本文档由 DeepSeek R1 模型生成并微调。
类描述
游戏中可移动对象的基类控制器,提供面向方向、移动队列管理和动画协调的通用移动能力。继承自 EventEmitter3,用于实现图块、角色等元素的移动控制。
graph LR
    ObjectMoverBase --> EventEmitter
    click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
核心属性
| 属性名 | 类型 | 说明 | 
|---|---|---|
| moveSpeed | number | 当前移动速度(毫秒/格) | 
| moveDir | Dir2 | 当前移动方向(八方向) | 
| moving | boolean | 是否处于移动状态 | 
| faceDir | Dir2 | 当前面朝方向(八方向) | 
| controller | IMoveController | 当前移动控制实例(只读) | 
事件说明
| 事件名 | 参数 | 触发时机 | 
|---|---|---|
| stepEnd | MoveStepDir | 单步移动完成时 | 
| moveEnd | - | 整个移动队列完成时 | 
| moveStart | MoveStep[] | 移动队列开始执行时 | 
方法说明
startMove
function startMove(): IMoveController | null;
功能
启动移动队列执行
返回值
IMoveController:移动控制器实例(可追加指令)
null:队列为空或已在移动中时返回
示例
const controller = mover.startMove();
if (controller) {
    controller.push({ type: 'dir', value: 'right' });
}
insertMove
function insertMove(...move: MoveStep[]): void;
| 参数 | 类型 | 说明 | 
|---|---|---|
| move | MoveStep[] | 移动指令序列 | 
功能
向队列末尾插入移动指令
示例
// 添加转向+加速指令
mover.insertMove({ type: 'dir', value: 'left' }, { type: 'speed', value: 200 });
clearMoveQueue
function clearMoveQueue(): void;
功能
清空所有待执行移动指令
注意
不影响已开始的移动步骤
oneStep
function oneStep(step: Move2): void;
| 参数 | 类型 | 说明 | 
|---|---|---|
| step | Move2 | 移动方向(支持八向/前后相对方向) | 
功能
添加单步方向移动指令
示例
// 添加面朝方向移动指令
mover.oneStep('forward');
moveAs
function moveAs(steps: MoveStep[]): void;
| 参数 | 类型 | 说明 | 
|---|---|---|
| steps | MoveStep[] | 结构化移动指令序列 | 
功能
批量加载复杂移动路径
示例
mover.moveAs([
    { type: 'dir', value: 'up' }, // 向上移动
    { type: 'speed', value: 150 }, // 修改速度为每 150ms 移动一格
    { type: 'dir', value: 'rightup' } // 右上45度移动
]);
setFaceDir
function setFaceDir(dir: Dir2): void;
| 参数 | 类型 | 说明 | 
|---|---|---|
| dir | Dir2 | 八方向面朝方向 | 
限制
仅在非移动状态生效
示例
// 设置角色面朝左上方
mover.setFaceDir('leftup');
setMoveDir
function setMoveDir(dir: Dir2): void;
| 参数 | 类型 | 说明 | 
|---|---|---|
| dir | Dir2 | 基础移动方向 | 
注意
影响forward/backward指令的实际方向
抽象方法
abstract onMoveStart
function onMoveStart(controller: IMoveController): Promise<void>;
触发时机
移动队列开始执行时
abstract onMoveEnd
function onMoveEnd(controller: IMoveController): Promise<void>;
触发时机
移动队列完成或被中断时
abstract onStepStart
function onStepStart(
    step: MoveStepDir,
    controller: IMoveController
): Promise<number>;
| 参数 | 类型 | 说明 | 
|---|---|---|
| step | MoveStepDir | 当前移动步骤 | 
| controller | IMoveController | 移动控制器 | 
返回值
Promise<number>:步骤执行标识码(用于后续传递)
abstract onStepEnd
function onStepEnd(
    step: MoveStepDir,
    code: number,
    controller: IMoveController
): Promise<void>;
| 参数 | 类型 | 说明 | 
|---|---|---|
| code | number | onStepStart返回的标识码 | 
| controller | IMoveController | 移动控制器 | 
abstract onSetMoveSpeed
function onSetMoveSpeed(speed: number, controller: IMoveController): void;
| 参数 | 类型 | 说明 | 
|---|---|---|
| speed | number | 新的移动速度值 | 
| controller | IMoveController | 移动控制器 | 
BlockMover
BlockMover 是基于 ObjectMoverBase 的内置类,用于实现图块移动。
graph LR
    BlockMover --> ObjectMoverBase
    ObjectMoverBase --> EventEmitter
    click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
新增方法
function bind(
    x: number,
    y: number,
    floorId: FloorIds,
    layer: FloorLayer,
    dir: Dir = 'down'
): boolean;
| 参数 | 类型 | 说明 | 
|---|---|---|
| x | number | 图块 X 坐标 | 
| y | number | 图块 Y 坐标 | 
| floorId | FloorIds | 所在楼层 ID | 
| layer | FloorLayer | 图层类型(bg/fg 等) | 
| dir | Dir | 初始方向 | 
返回值:绑定成功返回 true,若目标正在移动则返回 false
示例
if (blockMover.bind(5, 8, 'floor1', 'bg', 'up')) {
    blockMover.insertMove({ type: 'dir', value: 'right' });
}
HeroMover
HeroMover 是基于 ObjectMoverBase 的内置类,用于实现勇士移动。
graph LR
    HeroMover --> ObjectMoverBase
    ObjectMoverBase --> EventEmitter
    click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
覆盖方法
function startMove(
    ignoreTerrain: boolean = false,
    noRoute: boolean = false,
    inLockControl: boolean = false,
    autoSave: boolean = false
): IMoveController | null;
| 参数 | 说明 | 
|---|---|
| ignoreTerrain | 是否忽略地形,即是否穿墙 | 
| noRoute | 是否不计入录像 | 
| inLockControl | 是否是在锁定控制中移动的,例如事件中移动 | 
| autoSave | 在必要时刻是否自动存档 | 
其余用法与基类相同。
使用示例
勇士移动控制
import { heroMoverCollection } from '@user/data-state';
// 获取勇士移动控制器单例
const heroMover = heroMoveCollection.mover;
// 设置面朝方向为右侧
heroMover.setFaceDir('right');
// 添加移动指令:前进三步
heroMover.insertMove(
    { type: 'dir', value: 'forward' },
    { type: 'dir', value: 'forward' },
    { type: 'dir', value: 'forward' }
);
// 启动移动并获取控制器
const controller = heroMover.startMove(
    false, // 不允许穿墙
    true, // 不计入录像
    false, // 不在录像锁定中触发
    false // 不进行自动存档
);
if (controller) {
    // 动态追加移动指令
    controller.push({ type: 'dir', value: 'leftup' });
    // 监听移动完成事件
    controller.onEnd.then(() => {
        console.log('勇士移动完成');
    });
}
图块移动控制
import { BlockMover } from '@user/data-state';
// 创建图块移动器实例
const blockMover = new BlockMover();
// 绑定到(5,8)位置的背景图块
if (blockMover.bind(5, 8, 'floor1', 'bg', 'up')) {
    // 添加螺旋移动路径
    blockMover.moveAs([
        { type: 'dir', value: 'right' },
        { type: 'dir', value: 'down' },
        { type: 'dir', value: 'left' },
        { type: 'dir', value: 'up' }
    ]);
    // 设置移动速度为200像素/秒
    blockMover.insertMove({ type: 'speed', value: 200 });
    // 启动移动
    const ctrl = blockMover.startMove();
}
移动指令类型
type MoveStep =
    | { type: 'dir'; value: Move2 } // 方向指令
    | { type: 'speed'; value: number }; // 速度指令
注意事项
- 
方向优先级 
 forward/backward基于当前面朝方向计算,修改 faceDir 会影响实际移动方向
- 
速度叠加规则 
 多个 speed 指令按队列顺序覆盖,最终生效最后一个速度值
- 
移动中断处理 
 调用 controller.stop() 会立即中断移动并触发 moveEnd 事件