From d4bdc1651f6a78d1235a2c1fbc8e18bcad37e999 Mon Sep 17 00:00:00 2001 From: panw Date: Sat, 8 Feb 2025 10:51:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E4=BC=A4=E5=AE=B3=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E9=98=9F=E5=88=97,=E6=96=B9=E4=BE=BF=20debuf?= =?UTF-8?q?f=20=E5=8D=B3=E9=97=B4=E9=9A=94=E6=80=A7=E4=BC=A4=E5=AE=B3?= =?UTF-8?q?=E7=9A=84=E5=8A=A0=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/script/game/map/HeroHomeComp.ts | 8 +- assets/script/game/skill/HeroSkillSystem.ts | 93 +++++++++++---------- 2 files changed, 52 insertions(+), 49 deletions(-) diff --git a/assets/script/game/map/HeroHomeComp.ts b/assets/script/game/map/HeroHomeComp.ts index 9d733b48..5001c0a8 100644 --- a/assets/script/game/map/HeroHomeComp.ts +++ b/assets/script/game/map/HeroHomeComp.ts @@ -62,10 +62,12 @@ export class HeroHomeComp extends CCComp { this.h_uuid=uuid this.hero=HeroInfo[uuid] console.log("hero_show",uuid) - let skill1 = SkillSet[this.hero.sk1[0]] - let skill2 = SkillSet[this.hero.sk2[0]] - var sk_path = "game/skills/skill_icon" + // let skill1 = SkillSet[this.hero.skill[0]] + // let skill2 = SkillSet[this.hero.skill[1]] + // var sk_path = "game/skills/skill_icon" // var icon_path = "game/heros/herois" + + this.slv = Math.floor((smc.heros[uuid].lv) / 5); let content=this.node.getChildByName("show").getChildByName("content") content.getChildByName("name").getChildByName("value").getComponent(Label).string=this.hero.name diff --git a/assets/script/game/skill/HeroSkillSystem.ts b/assets/script/game/skill/HeroSkillSystem.ts index a26951d7..2a5a8203 100644 --- a/assets/script/game/skill/HeroSkillSystem.ts +++ b/assets/script/game/skill/HeroSkillSystem.ts @@ -39,6 +39,7 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp // private updateInterval: number = 0.1; // 每0.1秒更新一次 // private accumulator: number = 0; private _timers: { [key: string]: number } = {}; + private _damageQueue: Array<{ timer: number; callback: () => void }> = []; init(): void { 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) { + // 处理伤害队列 + this.processDamageQueue(); const view = e.get(HeroViewComp); 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) { comp.skills.forEach(skillId => { @@ -295,58 +309,45 @@ export class HeroSkillSystem extends ecs.ComblockSystem implements ecs.ISystemUp return result; } - private applyDamage(target: ecs.Entity, result:any) { - const view = target.get(HeroViewComp); - if (!view.ent.has(HeroViewComp)) return; - this.scheduleOnce(()=>{ - // 护盾优先吸收伤害 - let remainingDamage = result.value; - if(result.isDodged){ - view.BUFFCOMP.tooltip(5,"*闪避*"); - return; - } - if (view.shield > 0) { - const shieldAbsorb = Math.min(view.shield, remainingDamage); - view.shield -= shieldAbsorb; - remainingDamage -= shieldAbsorb; + private applyDamage(target: ecs.Entity, result: any) { + this._damageQueue.push({ + timer: result.delay, + callback: () => { + const view = target.get(HeroViewComp); + if (!view?.ent.has(HeroViewComp)) return; + + if(result.isDodged){ + view.BUFFCOMP.tooltip(5,"*闪避*"); + return; + } + + let remainingDamage = result.value; + 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) { - view.BUFFCOMP.show_shield(false); + 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,"*吸收*"); } - } - - // 剩余伤害扣除血量 - 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() { console.log("clear_timer"); Object.values(this._timers).forEach(clearTimeout);