dd
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user