refactor(战斗系统): 优化伤害计算与技能释放逻辑,下一步 将伤害信标处理,改为队列处理
- 移除HeroViewComp中的调试日志 - 缩短技能释放前摇时间从0.3秒到0.1秒 - 重构Skill类,清理无用导入并优化属性传递 - 改进HeroAtkSystem,添加伤害数据深拷贝避免重复处理 - 完善SkillView,增加技能结束类型处理并优化伤害应用逻辑
This commit is contained in:
@@ -27,10 +27,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
private debugMode: boolean = false; // 是否启用调试模式
|
||||
|
||||
/**
|
||||
* 过滤器:只处理拥有 HeroAttrsComp 的实体
|
||||
* 过滤器:只处理拥有伤害数据的实体
|
||||
*/
|
||||
filter(): ecs.IMatcher {
|
||||
return ecs.allOf(HeroAttrsComp,DmgDataCom);
|
||||
return ecs.allOf(HeroAttrsComp, DmgDataCom);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -38,22 +38,38 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
*/
|
||||
entityEnter(e: ecs.Entity): void {
|
||||
const model = e.get(HeroAttrsComp);
|
||||
const dmgData=e.get(DmgDataCom)
|
||||
if (!model || !dmgData) return;
|
||||
let FDData = this.doAttack(e,dmgData)
|
||||
e.remove(DmgDataCom)
|
||||
console.log(`[HeroAtkSystem] 英雄${model.hero_name} (uuid: ${model.hero_uuid}) 受到伤害 ${FDData.damage},技能ID ${dmgData.s_uuid}`);
|
||||
const dmgData = e.get(DmgDataCom);
|
||||
if (!model || !dmgData) return;
|
||||
const caster = dmgData.caster;
|
||||
// 深度拷贝伤害数据,避免组件移除后数据丢失
|
||||
const dmgDataCopy = this.deepCopyDmgData(dmgData);
|
||||
// 立即移除组件,避免重复处理
|
||||
e.remove(DmgDataCom);
|
||||
|
||||
// 使用拷贝的数据进行伤害计算
|
||||
let FDData = this.doAttack(e, dmgDataCopy);
|
||||
console.log(`[HeroAtkSystem] 英雄${model.hero_name} (uuid: ${model.hero_uuid}) 受到 ${caster.ent.get(HeroAttrsComp).hero_name}(uuid: ${caster.ent.get(HeroAttrsComp).hero_uuid})的 伤害 ${FDData.damage},${FDData.isCrit?"暴击":"普通"}攻击,技能ID ${dmgDataCopy.s_uuid}`);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 深度拷贝伤害数据
|
||||
*/
|
||||
private deepCopyDmgData(dmgData: DmgDataCom): any {
|
||||
return {
|
||||
Attrs: dmgData.Attrs ? { ...dmgData.Attrs } : null,
|
||||
s_uuid: dmgData.s_uuid
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理角色被攻击
|
||||
* @param target 被攻击的目标实体
|
||||
* @param remainingDamage 基础伤害值
|
||||
* @param attackerAttrs 攻击者的属性
|
||||
* @param skillId 技能ID
|
||||
* @param dmgData 伤害数据(可以是组件或拷贝的对象)
|
||||
* @returns 实际造成的伤害
|
||||
*/
|
||||
public doAttack(target: ecs.Entity,dmgData:DmgDataCom): FDData {
|
||||
public doAttack(target: ecs.Entity, dmgDataCopy: any): FDData {
|
||||
const targetModel = target.get(HeroAttrsComp);
|
||||
const targetView = target.get(HeroViewComp);
|
||||
let reDate:FDData={
|
||||
@@ -61,11 +77,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
isCrit:false,
|
||||
isDodge:false,
|
||||
}
|
||||
console.log("[HeroAtkSystem] doAttack",target,dmgData)
|
||||
if (!targetModel || targetModel.is_dead) return reDate;
|
||||
|
||||
// 获取技能配置
|
||||
const skillConf = SkillSet[dmgData.s_uuid];
|
||||
const skillConf = SkillSet[dmgDataCopy.s_uuid];
|
||||
if (!skillConf) return reDate;
|
||||
|
||||
// 触发被攻击事件
|
||||
@@ -80,8 +95,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
|
||||
// 暴击判定
|
||||
const isCrit = this.checkCrit(targetModel.Attrs[Attrs.CRITICAL]);
|
||||
let damage = this.dmgCount(dmgData.Attrs,dmgData.s_uuid);
|
||||
|
||||
let damage = this.dmgCount(dmgDataCopy.Attrs,dmgDataCopy.s_uuid);
|
||||
if (isCrit) {
|
||||
damage = Math.floor(damage * (1 + (FightSet.CRIT_DAMAGE + targetModel.Attrs[Attrs.CRITICAL_DMG]) / 100));
|
||||
reDate.isCrit=true;
|
||||
@@ -91,8 +105,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
damage = this.calculateDamage(targetModel, damage);
|
||||
|
||||
// 护盾吸收
|
||||
damage = this.absorbShield(targetModel, damage);
|
||||
|
||||
damage =Math.floor(this.absorbShield(targetModel, damage))
|
||||
if (damage <= 0) return reDate;
|
||||
|
||||
// 应用伤害到数据层
|
||||
@@ -101,7 +114,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
|
||||
// ✅ 触发视图层表现(伤害数字、受击动画、后退)
|
||||
if (targetView) {
|
||||
targetView.do_atked(damage, isCrit, dmgData.s_uuid);
|
||||
targetView.do_atked(damage, isCrit, dmgDataCopy.s_uuid);
|
||||
}
|
||||
|
||||
// 检查死亡
|
||||
@@ -121,10 +134,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
return reDate;
|
||||
}
|
||||
//伤害计算,暂时简单计算
|
||||
private dmgCount(Attrs:any,s_uuid){
|
||||
private dmgCount(CAttrs:any,s_uuid:number){
|
||||
let sConf = SkillSet[s_uuid];
|
||||
if (!sConf) return 0;
|
||||
let AP = sConf.ap*Attrs[Attrs.AP];
|
||||
let AP = sConf.ap*CAttrs[Attrs.AP]/100;
|
||||
return AP;
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -297,7 +297,6 @@ export class HeroViewComp extends CCComp {
|
||||
let SConf=SkillSet[s_uuid]
|
||||
this.back()
|
||||
this.showDamage(damage, isCrit, SConf.AtkedName); // 暴击状态由战斗系统内部处理
|
||||
console.log("[HeroViewComp] do_atked",damage,isCrit,SConf.AtkedName)
|
||||
}
|
||||
//后退
|
||||
back(){
|
||||
|
||||
@@ -109,7 +109,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
||||
heroView.playSkillEffect(s_uuid);
|
||||
|
||||
// 2. 延迟创建技能实体(等待动画)
|
||||
const delay = config.with ?? 0.3; // 施法前摇时间
|
||||
const delay = 0.1
|
||||
heroView.scheduleOnce(() => {
|
||||
this.createSkill(s_uuid, heroView);
|
||||
}, delay);
|
||||
|
||||
Reference in New Issue
Block a user