将伤害执行加入队列,方便 debuff 即间隔性伤害的加入
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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,"*闪避*");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (view.shield > 0) {
|
|
||||||
const shieldAbsorb = Math.min(view.shield, remainingDamage);
|
|
||||||
view.shield -= shieldAbsorb;
|
|
||||||
remainingDamage -= shieldAbsorb;
|
|
||||||
|
|
||||||
if (view.shield <= 0) {
|
if(result.isDodged){
|
||||||
view.BUFFCOMP.show_shield(false);
|
view.BUFFCOMP.tooltip(5,"*闪避*");
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 剩余伤害扣除血量
|
let remainingDamage = result.value;
|
||||||
if (remainingDamage > 0) {
|
if (view.shield > 0) {
|
||||||
view.hp -= remainingDamage;
|
const shieldAbsorb = Math.min(view.shield, remainingDamage);
|
||||||
if(view.hp<=0) {
|
view.shield -= shieldAbsorb;
|
||||||
view.BUFFCOMP.dead()
|
remainingDamage -= shieldAbsorb;
|
||||||
view.exp_add(view.dexp)
|
|
||||||
view.to_grave();
|
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,"*吸收*");
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user