mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-24 16:13:24 +08:00
425 lines
9.3 KiB
Markdown
425 lines
9.3 KiB
Markdown
# 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 事件
|