From 0f9fb4e8fbd654b934c298e49c68752633b92f32 Mon Sep 17 00:00:00 2001 From: panfudan Date: Wed, 26 Mar 2025 00:10:05 +0800 Subject: [PATCH] dd --- assets/script/game/skill/HeroSkillSystem.ts | 68 ++++++++++++++------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/assets/script/game/skill/HeroSkillSystem.ts b/assets/script/game/skill/HeroSkillSystem.ts index b95644f0..7e811b41 100644 --- a/assets/script/game/skill/HeroSkillSystem.ts +++ b/assets/script/game/skill/HeroSkillSystem.ts @@ -118,6 +118,7 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp private castSkill(caster: ecs.Entity, skillId: number, config: typeof SkillSet[keyof typeof SkillSet]) { const view = caster.get(HeroViewComp); const comp = caster.get(HeroSkillsComp); + const skillEntity = ecs.getEntity(Skill); console.log(view.hero_name+"施放技能:"+config.uuid+"=>"+view.hero_name); // 处理CD和消耗 @@ -134,7 +135,6 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp if (config.TargetGroup === TargetGroup.Enemy) { const targets = this.selectEnemyTargets(caster, config); if (targets.length === 0) return; - const skillEntity = ecs.getEntity(Skill); skillEntity.load( view.node.position, // 起始位置 view.fac, // 阵营 @@ -143,7 +143,8 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp targets[0]?.get(HeroViewComp).node.position // 目标位置 ); targets.forEach(target => { - this.applySkillEffect(caster, target, config); + this.applySkillEffect(caster, target, config,skillEntity); + console.log("施放技能:"+config.uuid+"=>"+target.get(HeroViewComp).hero_name); }); } @@ -151,11 +152,11 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp const targets = this.selectAllyTargets(caster, config); if (targets.length === 0) return; targets.forEach(target => { - this.applySkillEffect(caster, target, config); + this.applySkillEffect(caster, target, config,skillEntity); }); } if (config.TargetGroup === TargetGroup.Self) { - this.applySkillEffect(caster, caster, config); + this.applySkillEffect(caster, caster, config,skillEntity); } } @@ -205,13 +206,15 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp } /** 应用技能效果 */ - private applySkillEffect(caster: ecs.Entity, target: ecs.Entity, config: typeof SkillSet[keyof typeof SkillSet]) { + private applySkillEffect(caster: ecs.Entity, target: ecs.Entity, config: typeof SkillSet[keyof typeof SkillSet],skillEntity:ecs.Entity) { const casterView = caster.get(HeroViewComp); const targetView = target.get(HeroViewComp); // 直接计算伤害(包含防御减免) const damageResult = this.calculateDamage(caster, target, config); - this.applyDamage(target, damageResult); + + // 将施法者传入applyDamage方法 + this.applyDamage(caster, target, damageResult,skillEntity); // 播放技能特效 casterView.playSkillEffect(config.uuid); @@ -250,39 +253,60 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp return result; } - private applyDamage(target: ecs.Entity, result: any) { + private applyDamage(caster: ecs.Entity, target: ecs.Entity, result: any,skillEntity:ecs.Entity) { + const casterView = caster.get(HeroViewComp); + const targetView = target.get(HeroViewComp); + const skillView = skillEntity.get(SkillCom); + if (!casterView || !targetView || !skillView) return; + + // 计算距离 + const distance = this.calculateDistance( + skillView.node.position, + targetView.node.position + ); + + // 假设技能效果移动速度为 500 units/second + const EFFECT_SPEED = 500; + // 计算实际延迟时间(秒) + const actualDelay = distance / EFFECT_SPEED; + this._damageQueue.push({ - timer: result.delay, + timer: actualDelay, callback: () => { - const view = target.get(HeroViewComp); - if (!view?.ent.has(HeroViewComp)) return; + if (!targetView?.ent.has(HeroViewComp)) return; let remainingDamage = result.value; - if (view.shield > 0) { - const shieldAbsorb = Math.min(view.shield, remainingDamage); - view.shield -= shieldAbsorb; + if (targetView.shield > 0) { + const shieldAbsorb = Math.min(targetView.shield, remainingDamage); + targetView.shield -= shieldAbsorb; remainingDamage -= shieldAbsorb; - if (view.shield <= 0) { - view.BUFFCOMP.show_shield(false); + if (targetView.shield <= 0) { + targetView.BUFFCOMP.show_shield(false); } } if (remainingDamage > 0) { - view.hp -= remainingDamage; - if(view.hp <= 0) { - view.BUFFCOMP.dead() - view.to_grave(); + targetView.hp -= remainingDamage; + if(targetView.hp <= 0) { + targetView.BUFFCOMP.dead() + targetView.to_grave(); } - view.showDamage(result.value, true); + targetView.showDamage(result.value, true); } else { - view.BUFFCOMP.tooltip(5,"*吸收*"); + targetView.BUFFCOMP.tooltip(5,"*吸收*"); } - } }); } + // 添加计算距离的辅助方法 + private calculateDistance(pos1: Vec3, pos2: Vec3): number { + const dx = pos2.x - pos1.x; + const dy = pos2.y - pos1.y; + return Math.sqrt(dx * dx + dy * dy); + } + public clear_timer() { console.log("clear_timer"); Object.values(this._timers).forEach(clearTimeout);