将伤害执行加入队列,方便 debuff 即间隔性伤害的加入

This commit is contained in:
2025-02-08 10:51:51 +08:00
parent 6e1c7ee715
commit d4bdc1651f
2 changed files with 52 additions and 49 deletions

View File

@@ -62,10 +62,12 @@ export class HeroHomeComp extends CCComp {
this.h_uuid=uuid this.h_uuid=uuid
this.hero=HeroInfo[uuid] this.hero=HeroInfo[uuid]
console.log("hero_show",uuid) console.log("hero_show",uuid)
let skill1 = SkillSet[this.hero.sk1[0]] // let skill1 = SkillSet[this.hero.skill[0]]
let skill2 = SkillSet[this.hero.sk2[0]] // let skill2 = SkillSet[this.hero.skill[1]]
var sk_path = "game/skills/skill_icon" // var sk_path = "game/skills/skill_icon"
// var icon_path = "game/heros/herois" // var icon_path = "game/heros/herois"
this.slv = Math.floor((smc.heros[uuid].lv) / 5); this.slv = Math.floor((smc.heros[uuid].lv) / 5);
let content=this.node.getChildByName("show").getChildByName("content") let content=this.node.getChildByName("show").getChildByName("content")
content.getChildByName("name").getChildByName("value").getComponent(Label).string=this.hero.name content.getChildByName("name").getChildByName("value").getComponent(Label).string=this.hero.name

View File

@@ -39,6 +39,7 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
// private updateInterval: number = 0.1; // 每0.1秒更新一次 // private updateInterval: number = 0.1; // 每0.1秒更新一次
// private accumulator: number = 0; // private accumulator: number = 0;
private _timers: { [key: string]: number } = {}; private _timers: { [key: string]: number } = {};
private _damageQueue: Array<{ timer: number; callback: () => void }> = [];
init(): void { init(): void {
oops.message.on(GameEvent.MissionEnd, this.clear_timer, this); oops.message.on(GameEvent.MissionEnd, this.clear_timer, this);
} }
@@ -48,6 +49,8 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
update(e: ecs.Entity) { update(e: ecs.Entity) {
// 处理伤害队列
this.processDamageQueue();
const view = e.get(HeroViewComp); const view = e.get(HeroViewComp);
const skills = e.get(HeroSkillsComp); const skills = e.get(HeroSkillsComp);
@@ -64,6 +67,17 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
}); });
} }
private processDamageQueue() {
const delta = this.dt;
for (let i = this._damageQueue.length - 1; i >= 0; i--) {
this._damageQueue[i].timer -= delta;
if (this._damageQueue[i].timer <= 0) {
this._damageQueue[i].callback();
this._damageQueue.splice(i, 1);
}
}
}
/** 处理所有技能逻辑 */ /** 处理所有技能逻辑 */
private processSkills(entity: ecs.Entity, comp: HeroSkillsComp) { private processSkills(entity: ecs.Entity, comp: HeroSkillsComp) {
comp.skills.forEach(skillId => { comp.skills.forEach(skillId => {
@@ -295,58 +309,45 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp
return result; return result;
} }
private applyDamage(target: ecs.Entity, result:any) { private applyDamage(target: ecs.Entity, result: any) {
const view = target.get(HeroViewComp); this._damageQueue.push({
if (!view.ent.has(HeroViewComp)) return; timer: result.delay,
this.scheduleOnce(()=>{ callback: () => {
// 护盾优先吸收伤害 const view = target.get(HeroViewComp);
let remainingDamage = result.value; if (!view?.ent.has(HeroViewComp)) return;
if(result.isDodged){
view.BUFFCOMP.tooltip(5,"*闪避*"); if(result.isDodged){
return; view.BUFFCOMP.tooltip(5,"*闪避*");
} return;
if (view.shield > 0) { }
const shieldAbsorb = Math.min(view.shield, remainingDamage);
view.shield -= shieldAbsorb; let remainingDamage = result.value;
remainingDamage -= shieldAbsorb; if (view.shield > 0) {
const shieldAbsorb = Math.min(view.shield, remainingDamage);
view.shield -= shieldAbsorb;
remainingDamage -= shieldAbsorb;
if (view.shield <= 0) {
view.BUFFCOMP.show_shield(false);
}
}
if (view.shield <= 0) { if (remainingDamage > 0) {
view.BUFFCOMP.show_shield(false); view.hp -= remainingDamage;
if(view.hp <= 0) {
view.BUFFCOMP.dead()
view.exp_add(view.dexp)
view.to_grave();
}
view.showDamage(result.value, result.isCrit);
} else {
view.BUFFCOMP.tooltip(5,"*吸收*");
} }
}
// 剩余伤害扣除血量
if (remainingDamage > 0) {
view.hp -= remainingDamage;
if(view.hp<=0) {
view.BUFFCOMP.dead()
view.exp_add(view.dexp)
view.to_grave();
}
view.showDamage(result.value, result.isCrit);
}else{
view.BUFFCOMP.tooltip(5,"*吸收*");
}
}, result.delay) }
// 直接触发事件
oops.message.dispatchEvent("OnDamage", {
target,
damage: result.value,
isCrit: result.isCrit
}); });
} }
private scheduleOnce(callback: () => void, delay: number) {
const timer = setTimeout(() => {
callback();
delete this._timers[timer];
}, delay * 1000);
this._timers[timer] = timer;
}
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);