refactor(战斗): 重构英雄阵型位置计算逻辑
- 将阵型位置计算提取到公共配置模块,定义 FormationPointX 映射 - 新增 resolveRangeTypeByHeroType 函数根据英雄类型解析默认攻击范围 - 新增 resolveFormationTargetX 函数统一计算英雄阵型目标X坐标 - 在 Hero 和 MoveSystem 中复用新的阵型计算函数,消除重复逻辑 - 优化远程英雄战斗逻辑,使其能根据阵型位置和攻击范围动态调整站位
This commit is contained in:
@@ -51,6 +51,26 @@ export const HeroPos={
|
||||
1:{pos:v3(0,BoxSet.GAME_LINE,0)},
|
||||
2:{pos:v3(0,BoxSet.GAME_LINE,0)},
|
||||
}
|
||||
|
||||
export const FormationPointX = {
|
||||
[SkillRange.Melee]: 0,
|
||||
[SkillRange.Mid]: 100,
|
||||
[SkillRange.Long]: 180,
|
||||
} as const;
|
||||
|
||||
export const resolveRangeTypeByHeroType = (type: HType, rangeType?: SkillRange | null): SkillRange => {
|
||||
if (rangeType !== undefined && rangeType !== null) return rangeType;
|
||||
if (type === HType.warrior || type === HType.assassin) return SkillRange.Melee;
|
||||
if (type === HType.remote) return SkillRange.Long;
|
||||
return SkillRange.Mid;
|
||||
}
|
||||
|
||||
export const resolveFormationTargetX = (fac: FacSet, type: HType, rangeType?: SkillRange | null): number => {
|
||||
const resolvedRangeType = resolveRangeTypeByHeroType(type, rangeType);
|
||||
const side = fac === FacSet.MON ? 1 : -1;
|
||||
return FormationPointX[resolvedRangeType] * side;
|
||||
}
|
||||
|
||||
export const MonSet = {
|
||||
0:{pos:v3(360,BoxSet.GAME_LINE+10,0)},
|
||||
1:{pos:v3(360,BoxSet.GAME_LINE-10,0)},
|
||||
|
||||
@@ -5,7 +5,7 @@ import { smc } from "../common/SingletonModuleComp";
|
||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||
import { HeroViewComp } from "./HeroViewComp";
|
||||
import { BoxSet, FacSet, FightSet, IndexSet } from "../common/config/GameSet";
|
||||
import { HeroInfo, HeroPos, HType } from "../common/config/heroSet";
|
||||
import { HeroInfo, HeroPos, resolveFormationTargetX } from "../common/config/heroSet";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { Attrs} from "../common/config/HeroAttrs";
|
||||
import { MoveComp } from "./MoveComp";
|
||||
@@ -95,14 +95,8 @@ export class Hero extends ecs.Entity {
|
||||
oops.message.dispatchEvent(GameEvent.MasterCalled,{uuid:uuid})
|
||||
const move = this.get(MoveComp);
|
||||
move.direction = 1; // 向右移动
|
||||
move.targetX = 0; // 右边界'
|
||||
move.targetX = resolveFormationTargetX(model.fac, model.type, model.rangeType);
|
||||
move.baseY = pos.y;
|
||||
if(HeroInfo[uuid].type==HType.remote){
|
||||
move.targetX = -100; // 右边界'
|
||||
}
|
||||
if(HeroInfo[uuid].type==HType.mage){
|
||||
move.targetX = -200; // 右边界'
|
||||
}
|
||||
smc.vmdata.mission_data.hero_num++
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user