fix(map,hero): 完善怪物入场排队逻辑

1. 给怪物刷出生成方法添加rank参数,用于计算出生位置
2. 新增怪物入场归位逻辑,替换原有的闲置状态处理
3. 更新注释描述,修正准备阶段怪物行为说明
This commit is contained in:
panFD
2026-09-13 11:50:05 +08:00
parent d3e7438bca
commit 1754e0d408
2 changed files with 45 additions and 7 deletions

View File

@@ -134,14 +134,14 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
}
/** 准备阶段:不推进不索敌;英雄向编队槽位排队移动,怪物原地待命 */
/** 准备阶段:不推进不索敌;英雄向编队槽位排队移动,怪物向出生目标位归位 */
if (!smc.mission.in_fight) {
this.clearCombatTarget(model);
model.is_atking = false;
if (model.fac === FacSet.HERO) {
this.processHeroQueue(e, model, move, view);
} else {
view.status_change("idle");
this.processMonQueue(move, view, model);
}
return;
}
@@ -220,6 +220,42 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
}
// ======================== 怪物入场归位(准备阶段) ========================
/**
* 怪物入场归位:从屏幕右边缘向 move.targetX(目标排锚点)移动,到位后 idle。
* 与英雄 processHeroQueue 对称,但怪物目标位在出生时由 MissionMonComp 一次性写入 targetX,无需动态重算槽位。
* 到位容差 2px,与英雄一致。
*/
private processMonQueue(move: MoveComp, view: HeroViewComp, model: HeroAttrsComp): void {
const targetX = move.targetX;
const selfX = view.node.position.x;
if (Math.abs(targetX - selfX) <= 2) {
if (Math.abs(selfX - targetX) > 0.01) {
view.node.setPosition(targetX, view.node.position.y, 0);
}
view.scale = -1;
view.status_change("idle");
return;
}
const dir = targetX > selfX ? 1 : -1;
move.direction = dir;
view.scale = dir;
const dist = Math.abs(targetX - selfX);
const speed = Math.max(model.speed / 3, dist / MoveSystem.QUEUE_ARRIVE_TIME);
const delta = speed * this.dt * dir;
let newX = selfX + delta;
if ((dir > 0 && newX > targetX) || (dir < 0 && newX < targetX)) {
newX = targetX;
}
if (Math.abs(newX - selfX) >= 0.01) {
view.node.setPosition(newX, view.node.position.y, 0);
view.status_change("move");
}
}
/** 查询当前英雄的编队槽位目标 X(无槽位返回 null) */
private resolveHeroQueueTargetX(entity: ecs.Entity): number | null {
const now = Date.now() / 1000;