feat(护盾系统): 完善护盾功能并添加吸收提示

- 在GameSet.ts中添加shield类型提示
- HeroViewComp新增shield_tip方法显示护盾吸收值
- 修改HeroAttrsComp移除护盾值上限限制
- TooltipCom添加shield类型提示处理
- 调整SACastSystem中治疗和护盾技能计算方式
- HeroAtkSystem优化护盾吸收逻辑并添加吸收提示
This commit is contained in:
walkpan
2025-12-31 23:36:55 +08:00
parent f858580b34
commit 0ec1dcfd0d
6 changed files with 41 additions and 14 deletions

View File

@@ -147,4 +147,5 @@ export const TooltipTypes = {
apup:7,
hpup:8,
addmp:9,
shield:10,
}

View File

@@ -36,7 +36,7 @@ interface FinalData {
@ecs.register('HeroAtkSystem')
export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
private debugMode: boolean = false; // 是否启用调试模式
private debugMode: boolean = true; // 是否启用调试模式
/**
* 过滤器:处理拥有伤害队列的实体
@@ -164,8 +164,13 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
}
if (this.debugMode) console.log("[HeroAtkSystem] after crit",damage)
// 护盾吸收
damage =Math.floor(this.absorbShield(TAttrsComp, damage))
const shieldResult = this.absorbShield(TAttrsComp, damage);
damage = shieldResult.remainingDamage;
if (this.debugMode) console.log("[HeroAtkSystem] after shield",damage)
// 显示护盾吸收飘字
if (shieldResult.absorbedDamage > 0 && targetView) {
targetView.shield_tip(shieldResult.absorbedDamage);
}
if (damage <= 0) return reDate;
// 应用伤害到数据层
TAttrsComp.hp -= damage;
@@ -429,10 +434,14 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
*
* @param TAttrsComp 被攻击者的属性组件(包含当前护盾值)
* @param damage 原始伤害值
* @returns 剩余伤害值(护盾吸收后的结果)
* @returns {remainingDamage, absorbedDamage} 剩余伤害值和吸收的护盾值
*/
private absorbShield(TAttrsComp: HeroAttrsComp, damage: number): number {
if (TAttrsComp.shield <= 0) return damage;
private absorbShield(TAttrsComp: HeroAttrsComp, damage: number): {remainingDamage: number, absorbedDamage: number} {
if (TAttrsComp.shield <= 0) {
console.log("[HeroAtkSystem] 护盾值小于等于0无法吸收伤害");
return {remainingDamage: damage, absorbedDamage: 0};
};
if (TAttrsComp.shield >= damage) {
TAttrsComp.shield -= damage;
@@ -440,12 +449,15 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
TAttrsComp.shield = 0;
TAttrsComp.Attrs[Attrs.SHIELD_MAX] = 0;
}
return 0;
console.log(`[HeroAtkSystem] 护盾值完全吸收伤害 ${damage}`);
return {remainingDamage: 0, absorbedDamage: damage};
} else {
const absorbedDamage = TAttrsComp.shield;
const remainingDamage = damage - TAttrsComp.shield;
TAttrsComp.shield = 0;
TAttrsComp.Attrs[Attrs.SHIELD_MAX] = 0;
return remainingDamage;
console.log(`[HeroAtkSystem] 护盾值部分吸收伤害 ${absorbedDamage}`);
return {remainingDamage, absorbedDamage};
}
}

View File

@@ -159,7 +159,6 @@ export class HeroAttrsComp extends ecs.Comp {
addValue = value * this.Attrs[Attrs.HP_MAX] / 100;
}
this.shield += addValue;
this.shield = Math.max(0, Math.min(this.shield, this.Attrs[Attrs.HP_MAX]));
this.dirty_shield = true; // 标记护盾需要更新
}
// ==================== BUFF 管理 ====================

View File

@@ -280,6 +280,11 @@ export class HeroViewComp extends CCComp {
let pos = v3(x, ny, 0);
tip.load(pos, type, value, s_uuid, this.node.parent);
}
/** 护盾吸收提示 */
shield_tip(absorbed: number) {
this.hp_tip(TooltipTypes.life, absorbed.toFixed(0));
}
/** 治疗特效 */
private heathed() {

View File

@@ -9,6 +9,7 @@ import { smc } from "../common/SingletonModuleComp";
import { TalComp } from "./TalComp";
import { TalEffet, TriType } from "../common/config/TalSet";
import { BoxSet } from "../common/config/GameSet";
import { Attrs } from "../common/config/HeroAttrs";
/**
* ==================== 自动施法系统 ====================
@@ -389,14 +390,14 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
* 执行治疗技能
*/
private executeHealSkill(casterEntity: ecs.Entity, s_uuid: number, heroView: HeroViewComp, hset: HSSet): boolean {
const heroAttrs = casterEntity.get(HeroAttrsComp);
const hAttrsCom = casterEntity.get(HeroAttrsComp);
const config = SkillSet[s_uuid];
if (!config) return false;
const targets = this.sHealTargets(heroView, heroAttrs, config);
const targets = this.sHealTargets(heroView, hAttrsCom, config);
if (targets.length === 0) return false;
const healAmount = config.ap;
const healAmount = config.ap * hAttrsCom.Attrs[Attrs.HP_MAX];
const delay = 0.3;
heroView.scheduleOnce(() => {
@@ -417,14 +418,14 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
* 执行护盾技能
*/
private executeShieldSkill(casterEntity: ecs.Entity, s_uuid: number, heroView: HeroViewComp, hset: HSSet): boolean {
const heroAttrs = casterEntity.get(HeroAttrsComp);
const hAttrsCom = casterEntity.get(HeroAttrsComp);
const config = SkillSet[s_uuid];
if (!config) return false;
const targets = this.sShieldTargets(heroView, heroAttrs, config);
const targets = this.sShieldTargets(heroView, hAttrsCom, config);
if (targets.length === 0) return false;
const shieldAmount = config.ap;
const shieldAmount = config.ap * hAttrsCom.Attrs[Attrs.HP_MAX];
const delay = 0.3;
heroView.scheduleOnce(() => {

View File

@@ -102,6 +102,15 @@ export class TooltipCom extends CCComp {
this.scheduleOnce(()=>{
this.ent.destroy()
},0.5)
break
case TooltipTypes.shield:
this.node.setSiblingIndex(110);
this.node.getChildByName("add_life").getChildByName("hp").getComponent(Label).string = this.value;
this.node.getChildByName("add_life").active=true;
this.scheduleOnce(()=>{
this.ent.destroy()
},0.5)
break
}
// console.log("TooltipView start:",this.node.getSiblingIndex());