feat(battle): 重构技能施放与战斗距离系统

- 新增技能距离缓存机制,根据英雄类型动态计算最小和最大攻击范围
- 重构SCastSystem实现完整的技能施放逻辑,支持伤害、治疗、护盾和buff技能
- 在Hero和Monster初始化时调用updateSkillDistanceCache预计算技能距离
- 修改HeroMoveSystem和MonMoveSystem使用动态战斗范围,支持撤退逻辑
- 优化Skill实体创建,增加对象池支持
- 添加技能CD触发方法和状态检查方法
This commit is contained in:
walkpan
2026-03-12 09:13:28 +08:00
parent ce2cd05ba9
commit 5d09b3361e
7 changed files with 194 additions and 35 deletions

View File

@@ -110,11 +110,13 @@ export class HeroMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const currentX = view.node.position.x;
const enemyX = enemy.node.position.x;
const dist = Math.abs(currentX - enemyX);
const attackRange = 75; // 保持原有的近战判定
const [minRange, maxRange] = this.resolveCombatRange(model, 0, 75);
move.direction = enemyX > currentX ? 1 : -1;
if (dist <= attackRange) {
if (dist < minRange) {
this.performRetreat(view, move, model, currentX);
} else if (dist <= maxRange) {
view.status_change("idle");
model.is_atking = true;
} else {
@@ -134,8 +136,7 @@ export class HeroMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const enemyX = enemy.node.position.x;
const dist = Math.abs(currentX - enemyX);
const minRange = 120;
const maxRange = 360;
const [minRange, maxRange] = this.resolveCombatRange(model, 120, 360);
move.direction = enemyX > currentX ? 1 : -1;
@@ -164,8 +165,7 @@ export class HeroMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const enemyX = enemy.node.position.x;
const dist = Math.abs(currentX - enemyX);
const minRange = 360;
const maxRange = 720;
const [minRange, maxRange] = this.resolveCombatRange(model, 360, 720);
move.direction = enemyX > currentX ? 1 : -1;
@@ -245,6 +245,14 @@ export class HeroMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
}
}
private resolveCombatRange(model: HeroAttrsComp, defaultMin: number, defaultMax: number): [number, number] {
const minRange = model.getCachedMinSkillDistance();
const maxRange = model.getCachedMaxSkillDistance();
if (maxRange <= 0) return [defaultMin, defaultMax];
const safeMin = Math.max(0, Math.min(minRange, maxRange - 20));
return [safeMin, maxRange];
}
// --- 辅助方法 ---
private findNearestEnemy(entity: ecs.Entity): HeroViewComp | null {