diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index db0bccc6..777ed26a 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -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)}, diff --git a/assets/script/game/hero/Hero.ts b/assets/script/game/hero/Hero.ts index ad44b48f..6db39b72 100644 --- a/assets/script/game/hero/Hero.ts +++ b/assets/script/game/hero/Hero.ts @@ -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++ } diff --git a/assets/script/game/hero/MoveComp.ts b/assets/script/game/hero/MoveComp.ts index 01fab085..a5b7f694 100644 --- a/assets/script/game/hero/MoveComp.ts +++ b/assets/script/game/hero/MoveComp.ts @@ -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) {