From a283e98e981a573317d52e61063656eb3da7ac9f Mon Sep 17 00:00:00 2001 From: panw Date: Fri, 8 Aug 2025 17:12:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=B1=E9=9B=84=20=E4=BD=8D=E7=A7=BB=20=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/script/game/common/config/heroSet.ts | 4 +- .../common/ecs/position/BattleMoveSystem.ts | 117 +++++++++++++++++- 2 files changed, 117 insertions(+), 4 deletions(-) diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index cc3bd105..6af5aef9 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -256,11 +256,11 @@ export const HeroInfo = { //主将 5001:{uuid:5001,name:"火焰骑士",path:"k2", quality:HQuality.BLUE,lv:1,kind:1, - type:HType.warrior,hp:100,ap:15,dis:400,cd:1.5,speed:50,skills:[6011,6020], + type:HType.warrior,hp:100,ap:15,dis:100,cd:1.5,speed:50,skills:[6011,6020], buff:[],info:"剑类专精,穿刺伤害额外+10%"}, 5002:{uuid:5002,name:"圣盾骑士",path:"k3", quality:HQuality.BLUE,lv:1,kind:1, - type:HType.warrior,hp:100,ap:15,dis:400,cd:1.5,speed:50,skills:[6011,6004], + type:HType.warrior,hp:100,ap:15,dis:100,cd:1.5,speed:50,skills:[6011,6004], buff:[],info:"斧类专精,风怒概率增加10%"}, // 5003:{uuid:5003,name:"碎颅.赫克托",path:"k4", quality:HQuality.BLUE,lv:1,kind:1, diff --git a/assets/script/game/common/ecs/position/BattleMoveSystem.ts b/assets/script/game/common/ecs/position/BattleMoveSystem.ts index e0fa1a10..cc07ae3c 100644 --- a/assets/script/game/common/ecs/position/BattleMoveSystem.ts +++ b/assets/script/game/common/ecs/position/BattleMoveSystem.ts @@ -2,7 +2,7 @@ import { HeroViewComp } from "../../../hero/HeroViewComp"; import { BattleMoveComp } from "./BattleMoveComp"; import { ecs } from "../../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { smc } from "../../SingletonModuleComp"; -import { BoxSet, FacSet } from "../../config/BoxSet"; +import { FacSet } from "../../config/BoxSet"; import { oops } from "db://oops-framework/core/Oops"; import { GameEvent } from "../../config/GameEvent"; import { FightSet } from "../../config/Mission"; @@ -39,6 +39,84 @@ export class BattleMoveSystem extends ecs.ComblockSystem implements ecs.ISystemU view.status_change("idle"); return; } + + // 英雄阵营特殊逻辑:检查是否有敌人存在 + if (view.fac == FacSet.HERO) { + const hasEnemies = this.checkEnemiesExist(e); + const inAttackRange = view.is_atking; + + // 如果有敌人,继续前进 + if (hasEnemies) { + // 找到最近的敌人,调整移动方向 + const nearestEnemy = this.findNearestEnemy(e); + if (nearestEnemy) { + const enemyX = nearestEnemy.node.position.x; + const currentX = view.node.position.x; + + // 根据敌人位置调整移动方向和朝向 + if (enemyX > currentX) { + move.direction = 1; // 向右移动 + view.node.setScale(1, 1, 1); // 面向右侧 + } else { + move.direction = -1; // 向左移动 + view.node.setScale(-1, 1, 1); // 面向左侧 + } + + // 继续向敌人方向移动 + const delta = ((view.speed-view.DEBUFF_SLOW)/3) * this.dt * move.direction; + const newX = view.node.position.x + delta; + + // 对于英雄,允许更自由的移动范围 + if (newX >= -420 && newX <= 420) { // 使用地图边界 + view.status_change("move"); + view.node.setPosition(newX, view.node.position.y, 0); + } else { + view.status_change("idle"); + } + } + this.checkEnemiesInBase(e); + return; + } + + // 如果没有敌人,回到targetX + if (!hasEnemies) { + const currentX = view.node.position.x; + const targetX = move.targetX; + + // 如果不在目标位置,移动到目标位置 + if (Math.abs(currentX - targetX) > 1) { + // 确定移动方向:如果当前位置在目标位置右侧,向左移动;否则向右移动 + const direction = currentX > targetX ? -1 : 1; + const delta = ((view.speed-view.DEBUFF_SLOW)/3) * this.dt * direction; + const newX = view.node.position.x + delta; + + // 设置朝向 + if (direction === 1) { + view.node.setScale(1, 1, 1); // 面向右侧 + } else { + view.node.setScale(-1, 1, 1); // 面向左侧 + } + + // 确保不会超过目标位置 + if (direction === 1 && newX > targetX) { + view.node.setPosition(targetX, view.node.position.y, 0); + } else if (direction === -1 && newX < targetX) { + view.node.setPosition(targetX, view.node.position.y, 0); + } else { + view.node.setPosition(newX, view.node.position.y, 0); + } + view.status_change("move"); + } else { + view.status_change("idle"); + // 回到targetX后,面向右侧 + move.direction = 1; + view.node.setScale(1, 1, 1); // 面向右侧 + } + this.checkEnemiesInBase(e); + return; + } + } + // 计算移动量 const delta = ((view.speed-view.DEBUFF_SLOW)/3) * this.dt * move.direction; const newX = view.node.position.x + delta; @@ -63,6 +141,41 @@ export class BattleMoveSystem extends ecs.ComblockSystem implements ecs.ISystemU // console.log(`[${view.hero_name}] 类型:${view.type} 是否停止:${shouldStop} 方向:${move.direction} 位置:${view.node.position.x.toFixed(1)}`); } + /** 检查是否存在敌人 */ + private checkEnemiesExist(entity: ecs.Entity): boolean { + const team = entity.get(HeroViewComp).fac; + let hasEnemies = false; + ecs.query(ecs.allOf(HeroViewComp)).some(e => { + const view = e.get(HeroViewComp); + if (view.fac !== team && !view.is_dead) { + hasEnemies = true; + return true; + } + }); + return hasEnemies; + } + + /** 找到最近的敌人 */ + private findNearestEnemy(entity: ecs.Entity): HeroViewComp | null { + const currentPos = entity.get(HeroViewComp).node.position; + const team = entity.get(HeroViewComp).fac; + let nearestEnemy: HeroViewComp | null = null; + let minDistance = Infinity; + + ecs.query(ecs.allOf(HeroViewComp)).forEach(e => { + const view = e.get(HeroViewComp); + if (view.fac !== team && !view.is_dead) { + const distance = Math.abs(currentPos.x - view.node.position.x); + if (distance < minDistance) { + minDistance = distance; + nearestEnemy = view; + } + } + }); + + return nearestEnemy; + } + /** 验证目标位置有效性 */ private validatePosition(newX: number, move: BattleMoveComp): boolean { // 我方不能超过右边界,敌方不能超过左边界 @@ -76,7 +189,7 @@ export class BattleMoveSystem extends ecs.ComblockSystem implements ecs.ISystemU const view = entity.get(HeroViewComp); return view.node.position.x === -1000 || view.node.position.x === 1000; } - /**驾车敌人是否进入我放基地 */ + /**检测敌人是否进入我方基地 */ private checkEnemiesInBase(entity: ecs.Entity) { const view = entity.get(HeroViewComp); if(view.fac==FacSet.MON){