fix(hero.move): 修复战斗阶段英雄移动与攻击状态处理

添加战斗阶段移动限制逻辑,仅在非战斗时执行移动相关操作,修正战斗中的攻击状态与动画切换逻辑,避免异常行为。
This commit is contained in:
pan
2026-06-12 14:29:25 +08:00
parent 4026397cfe
commit 803e273187

View File

@@ -125,8 +125,12 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
move.baseY = slot.targetY;
move.targetX = slot.targetX;
// 战斗阶段不移动
const canMove = !smc.mission.in_fight;
// 2. 平滑 Y 轴换路
let isChangingLane = false;
if (canMove) {
if (Math.abs(view.node.position.y - move.baseY) > 2) {
const currentY = view.node.position.y;
const deltaY = move.baseY - currentY;
@@ -137,6 +141,7 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
} else {
view.node.setPosition(view.node.position.x, move.baseY, 0);
}
}
// 渲染层级重排
this.updateRenderOrder();
@@ -144,19 +149,32 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
const nearestEnemy = this.findNearestEnemy(e);
if (nearestEnemy) {
/** 有敌人:进入战斗位移逻辑 */
if (canMove) {
this.processCombatLogic(e, move, view, model, nearestEnemy);
} else {
model.is_atking = true; // 战斗中不移动,但保持攻击状态
}
this.syncCombatTarget(model, view, nearestEnemy);
} else {
/** 无敌人:清目标并回归编队站位 */
this.clearCombatTarget(model);
if (canMove) {
this.moveToSlot(view, move, model, move.targetX);
}
model.is_atking = false;
}
if (canMove) {
// 如果只在 Y 轴移动,也要播放 move 动画
if (isChangingLane && view.status !== "move" && view.status !== "atk") {
view.status_change("move");
}
} else {
// 战斗阶段如果不移动,确保不在攻击时恢复 idle 状态
if (!model.is_atking && view.status === "move") {
view.status_change("idle");
}
}
}
private clearCombatTarget(model: HeroAttrsComp): void {