This commit is contained in:
2025-03-26 00:10:05 +08:00
parent 1a6bff9d49
commit 0f9fb4e8fb

View File

@@ -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]) { private castSkill(caster: ecs.Entity, skillId: number, config: typeof SkillSet[keyof typeof SkillSet]) {
const view = caster.get(HeroViewComp); const view = caster.get(HeroViewComp);
const comp = caster.get(HeroSkillsComp); const comp = caster.get(HeroSkillsComp);
const skillEntity = ecs.getEntity<Skill>(Skill);
console.log(view.hero_name+"施放技能:"+config.uuid+"=>"+view.hero_name); console.log(view.hero_name+"施放技能:"+config.uuid+"=>"+view.hero_name);
// 处理CD和消耗 // 处理CD和消耗
@@ -134,7 +135,6 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
if (config.TargetGroup === TargetGroup.Enemy) { if (config.TargetGroup === TargetGroup.Enemy) {
const targets = this.selectEnemyTargets(caster, config); const targets = this.selectEnemyTargets(caster, config);
if (targets.length === 0) return; if (targets.length === 0) return;
const skillEntity = ecs.getEntity<Skill>(Skill);
skillEntity.load( skillEntity.load(
view.node.position, // 起始位置 view.node.position, // 起始位置
view.fac, // 阵营 view.fac, // 阵营
@@ -143,7 +143,8 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
targets[0]?.get(HeroViewComp).node.position // 目标位置 targets[0]?.get(HeroViewComp).node.position // 目标位置
); );
targets.forEach(target => { 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); const targets = this.selectAllyTargets(caster, config);
if (targets.length === 0) return; if (targets.length === 0) return;
targets.forEach(target => { targets.forEach(target => {
this.applySkillEffect(caster, target, config); this.applySkillEffect(caster, target, config,skillEntity);
}); });
} }
if (config.TargetGroup === TargetGroup.Self) { 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 casterView = caster.get(HeroViewComp);
const targetView = target.get(HeroViewComp); const targetView = target.get(HeroViewComp);
// 直接计算伤害(包含防御减免) // 直接计算伤害(包含防御减免)
const damageResult = this.calculateDamage(caster, target, config); const damageResult = this.calculateDamage(caster, target, config);
this.applyDamage(target, damageResult);
// 将施法者传入applyDamage方法
this.applyDamage(caster, target, damageResult,skillEntity);
// 播放技能特效 // 播放技能特效
casterView.playSkillEffect(config.uuid); casterView.playSkillEffect(config.uuid);
@@ -250,39 +253,60 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
return result; 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({ this._damageQueue.push({
timer: result.delay, timer: actualDelay,
callback: () => { callback: () => {
const view = target.get(HeroViewComp); if (!targetView?.ent.has(HeroViewComp)) return;
if (!view?.ent.has(HeroViewComp)) return;
let remainingDamage = result.value; let remainingDamage = result.value;
if (view.shield > 0) { if (targetView.shield > 0) {
const shieldAbsorb = Math.min(view.shield, remainingDamage); const shieldAbsorb = Math.min(targetView.shield, remainingDamage);
view.shield -= shieldAbsorb; targetView.shield -= shieldAbsorb;
remainingDamage -= shieldAbsorb; remainingDamage -= shieldAbsorb;
if (view.shield <= 0) { if (targetView.shield <= 0) {
view.BUFFCOMP.show_shield(false); targetView.BUFFCOMP.show_shield(false);
} }
} }
if (remainingDamage > 0) { if (remainingDamage > 0) {
view.hp -= remainingDamage; targetView.hp -= remainingDamage;
if(view.hp <= 0) { if(targetView.hp <= 0) {
view.BUFFCOMP.dead() targetView.BUFFCOMP.dead()
view.to_grave(); targetView.to_grave();
} }
view.showDamage(result.value, true); targetView.showDamage(result.value, true);
} else { } 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() { public clear_timer() {
console.log("clear_timer"); console.log("clear_timer");
Object.values(this._timers).forEach(clearTimeout); Object.values(this._timers).forEach(clearTimeout);