HumanBreak/docs/api/user-data-state/ObjectMoverBase.md

425 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ObjectMoverBase API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 类描述
游戏中可移动对象的基类控制器,提供面向方向、移动队列管理和动画协调的通用移动能力。继承自 EventEmitter3用于实现图块、角色等元素的移动控制。
```mermaid
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`
```typescript
function startMove(): IMoveController | null;
```
**功能**
启动移动队列执行
**返回值**
`IMoveController`:移动控制器实例(可追加指令)
`null`:队列为空或已在移动中时返回
**示例**
```typescript
const controller = mover.startMove();
if (controller) {
controller.push({ type: 'dir', value: 'right' });
}
```
---
### `insertMove`
```typescript
function insertMove(...move: MoveStep[]): void;
```
| 参数 | 类型 | 说明 |
| ------ | ------------ | ------------ |
| `move` | `MoveStep[]` | 移动指令序列 |
**功能**
向队列末尾插入移动指令
**示例**
```typescript
// 添加转向+加速指令
mover.insertMove({ type: 'dir', value: 'left' }, { type: 'speed', value: 200 });
```
---
### `clearMoveQueue`
```typescript
function clearMoveQueue(): void;
```
**功能**
清空所有待执行移动指令
**注意**
不影响已开始的移动步骤
---
### `oneStep`
```typescript
function oneStep(step: Move2): void;
```
| 参数 | 类型 | 说明 |
| ------ | ------- | --------------------------------- |
| `step` | `Move2` | 移动方向(支持八向/前后相对方向) |
**功能**
添加单步方向移动指令
**示例**
```typescript
// 添加面朝方向移动指令
mover.oneStep('forward');
```
---
### `moveAs`
```typescript
function moveAs(steps: MoveStep[]): void;
```
| 参数 | 类型 | 说明 |
| ------- | ------------ | ------------------ |
| `steps` | `MoveStep[]` | 结构化移动指令序列 |
**功能**
批量加载复杂移动路径
**示例**
```typescript
mover.moveAs([
{ type: 'dir', value: 'up' }, // 向上移动
{ type: 'speed', value: 150 }, // 修改速度为每 150ms 移动一格
{ type: 'dir', value: 'rightup' } // 右上45度移动
]);
```
---
### `setFaceDir`
```typescript
function setFaceDir(dir: Dir2): void;
```
| 参数 | 类型 | 说明 |
| ----- | ------ | -------------- |
| `dir` | `Dir2` | 八方向面朝方向 |
**限制**
仅在非移动状态生效
**示例**
```typescript
// 设置角色面朝左上方
mover.setFaceDir('leftup');
```
---
### `setMoveDir`
```typescript
function setMoveDir(dir: Dir2): void;
```
| 参数 | 类型 | 说明 |
| ----- | ------ | ------------ |
| `dir` | `Dir2` | 基础移动方向 |
**注意**
影响`forward/backward`指令的实际方向
---
## 抽象方法
### `abstract onMoveStart`
```typescript
function onMoveStart(controller: IMoveController): Promise<void>;
```
**触发时机**
移动队列开始执行时
---
### `abstract onMoveEnd`
```typescript
function onMoveEnd(controller: IMoveController): Promise<void>;
```
**触发时机**
移动队列完成或被中断时
---
### `abstract onStepStart`
```typescript
function onStepStart(
step: MoveStepDir,
controller: IMoveController
): Promise<number>;
```
| 参数 | 类型 | 说明 |
| ------------ | ----------------- | ------------ |
| `step` | `MoveStepDir` | 当前移动步骤 |
| `controller` | `IMoveController` | 移动控制器 |
**返回值**
`Promise<number>`:步骤执行标识码(用于后续传递)
---
### `abstract onStepEnd`
```typescript
function onStepEnd(
step: MoveStepDir,
code: number,
controller: IMoveController
): Promise<void>;
```
| 参数 | 类型 | 说明 |
| ------------ | ----------------- | -------------------------- |
| `code` | `number` | `onStepStart` 返回的标识码 |
| `controller` | `IMoveController` | 移动控制器 |
---
### `abstract onSetMoveSpeed`
```typescript
function onSetMoveSpeed(speed: number, controller: IMoveController): void;
```
| 参数 | 类型 | 说明 |
| ------------ | ----------------- | -------------- |
| `speed` | `number` | 新的移动速度值 |
| `controller` | `IMoveController` | 移动控制器 |
---
## BlockMover
`BlockMover` 是基于 `ObjectMoverBase` 的内置类,用于实现图块移动。
```mermaid
graph LR
BlockMover --> ObjectMoverBase
ObjectMoverBase --> EventEmitter
click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
```
### 新增方法
```typescript
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`
**示例**
```typescript
if (blockMover.bind(5, 8, 'floor1', 'bg', 'up')) {
blockMover.insertMove({ type: 'dir', value: 'right' });
}
```
---
## HeroMover
`HeroMover` 是基于 `ObjectMoverBase` 的内置类,用于实现勇士移动。
```mermaid
graph LR
HeroMover --> ObjectMoverBase
ObjectMoverBase --> EventEmitter
click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
```
### 覆盖方法
```ts
function startMove(
ignoreTerrain: boolean = false,
noRoute: boolean = false,
inLockControl: boolean = false,
autoSave: boolean = false
): IMoveController | null;
```
| 参数 | 说明 |
| --------------- | ---------------------------------------- |
| `ignoreTerrain` | 是否忽略地形,即是否穿墙 |
| `noRoute` | 是否不计入录像 |
| `inLockControl` | 是否是在锁定控制中移动的,例如事件中移动 |
| `autoSave` | 在必要时刻是否自动存档 |
其余用法与基类相同。
---
## 使用示例
### 勇士移动控制
```typescript
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('勇士移动完成');
});
}
```
### 图块移动控制
```typescript
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();
}
```
---
## 移动指令类型
```typescript
type MoveStep =
| { type: 'dir'; value: Move2 } // 方向指令
| { type: 'speed'; value: number }; // 速度指令
```
---
## 注意事项
1. **方向优先级**
`forward/backward` 基于当前面朝方向计算,修改 faceDir 会影响实际移动方向
2. **速度叠加规则**
多个 speed 指令按队列顺序覆盖,最终生效最后一个速度值
3. **移动中断处理**
调用 controller.stop() 会立即中断移动并触发 moveEnd 事件