refactor(战斗): 重构英雄阵型位置计算逻辑

- 将阵型位置计算提取到公共配置模块,定义 FormationPointX 映射
- 新增 resolveRangeTypeByHeroType 函数根据英雄类型解析默认攻击范围
- 新增 resolveFormationTargetX 函数统一计算英雄阵型目标X坐标
- 在 Hero 和 MoveSystem 中复用新的阵型计算函数,消除重复逻辑
- 优化远程英雄战斗逻辑,使其能根据阵型位置和攻击范围动态调整站位
This commit is contained in:
panw
2026-03-16 15:46:28 +08:00
parent acaa6125c2
commit 11e6f49479
3 changed files with 38 additions and 50 deletions

View File

@@ -3,7 +3,7 @@ import { HeroViewComp } from "./HeroViewComp";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { smc } from "../common/SingletonModuleComp";
import { FacSet } from "../common/config/GameSet";
import { HType } from "../common/config/heroSet";
import { HType, resolveFormationTargetX } from "../common/config/heroSet";
import { SkillRange } from "../common/config/SkillSet";
import { Node } from "cc";
@@ -141,36 +141,27 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
private processMidLogic(e: ecs.Entity, move: MoveComp, view: HeroViewComp, model: HeroAttrsComp, enemy: HeroViewComp) {
const currentX = view.node.position.x;
const enemyX = enemy.node.position.x;
const dist = Math.abs(currentX - enemyX);
const [, maxRange] = this.resolveCombatRange(model, 120, 360);
move.direction = enemyX > currentX ? 1 : -1;
if (dist > maxRange) {
const speed = model.speed / 3;
this.moveEntity(view, move.direction, speed);
model.is_atking = true;
} else {
view.status_change("idle");
model.is_atking = true;
}
this.processRangedFormationCombat(move, view, model, enemy, 120, 360);
}
private processLongLogic(e: ecs.Entity, move: MoveComp, view: HeroViewComp, model: HeroAttrsComp, enemy: HeroViewComp) {
this.processRangedFormationCombat(move, view, model, enemy, 360, 720);
}
private processRangedFormationCombat(move: MoveComp, view: HeroViewComp, model: HeroAttrsComp, enemy: HeroViewComp, defaultMin: number, defaultMax: number) {
const currentX = view.node.position.x;
const enemyX = enemy.node.position.x;
const targetX = this.getFixedFormationX(model);
move.targetX = targetX;
const [minRange, maxRange] = this.resolveCombatRange(model, defaultMin, defaultMax);
const dist = Math.abs(currentX - enemyX);
const [, maxRange] = this.resolveCombatRange(model, 360, 720);
move.direction = enemyX > currentX ? 1 : -1;
if (dist > maxRange) {
const needMoveToFormation = Math.abs(currentX - targetX) > 5;
const shouldKeepDistance = dist < minRange;
if (needMoveToFormation || shouldKeepDistance) {
const dir = targetX > currentX ? 1 : -1;
move.direction = dir;
const speed = model.speed / 3;
this.moveEntity(view, move.direction, speed);
this.moveEntity(view, dir, speed);
model.is_atking = true;
} else {
view.status_change("idle");
@@ -215,24 +206,7 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
private getFixedFormationX(model: HeroAttrsComp): number {
let rangeType = model.rangeType;
if (rangeType === undefined || rangeType === null) {
if (model.type === HType.remote) {
rangeType = SkillRange.Long;
} else if (model.type === HType.mage || model.type === HType.support) {
rangeType = SkillRange.Mid;
} else {
rangeType = SkillRange.Melee;
}
}
const side = model.fac === FacSet.MON ? 1 : -1;
if (rangeType === SkillRange.Long) {
return 300 * side;
}
if (rangeType === SkillRange.Mid) {
return 200 * side;
}
return 0;
return resolveFormationTargetX(model.fac, model.type, model.rangeType);
}
private moveEntity(view: HeroViewComp, direction: number, speed: number, stopAtX?: number) {