feat(英雄系统): 实现英雄升级和经验系统

- 在 HeroViewComp 中扩展怪物死亡事件数据,包含等级和类型信息
- 在 SingletonModuleComp 中实现完整的经验计算和升级逻辑
- 在 MissionComp 中添加经验获取和升级事件处理
- 在 RogueConfig 中添加经验计算公式和怪物经验配置
- 添加等级同步机制防止ECS数据覆盖
This commit is contained in:
walkpan
2026-01-03 10:09:35 +08:00
parent 7583ca7a37
commit 56452795bb
4 changed files with 317 additions and 185 deletions

View File

@@ -9,6 +9,7 @@ import * as exp from "constants";
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
import { Attrs } from "./config/HeroAttrs";
import { time } from "console";
import { getLevelExp } from "../map/RogueConfig";
/**
* 用远程数据覆盖本地数据(统一方法)
* @param remoteData 远程数据(云端或本地调试)
@@ -89,6 +90,40 @@ export class SingletonModuleComp extends ecs.Comp {
},
gold: 200, // 金币数据MVVM绑定字段
};
/**
* 更新英雄经验
* @param exp 获得的经验值
*/
updateHeroExp(exp: number) {
if (!this.vmdata.hero) return;
this.vmdata.hero.exp += exp;
// console.log('[smc] 英雄升级 经验:' + this.vmdata.hero.exp + ' 等级:' + this.vmdata.hero.lv + ' 上限:' + this.vmdata.hero.exp_max);
// 确保 exp_max 初始化
if (this.vmdata.hero.exp_max <= 0) {
this.vmdata.hero.exp_max = getLevelExp(this.vmdata.hero.lv || 1);
}
while (this.vmdata.hero.exp >= this.vmdata.hero.exp_max) {
this.vmdata.hero.exp -= this.vmdata.hero.exp_max;
this.vmdata.hero.lv++;
// 更新下一级所需经验
this.vmdata.hero.exp_max = getLevelExp(this.vmdata.hero.lv);
// 触发升级事件
oops.message.dispatchEvent(GameEvent.CanUpdateLv, { lv: this.vmdata.hero.lv });
}
// 更新进度条显示 (0-1)
if (this.vmdata.hero.exp_max > 0) {
this.vmdata.hero.exp_pre = Math.floor(this.vmdata.hero.exp / this.vmdata.hero.exp_max * 100);
} else {
this.vmdata.hero.exp_pre = 0;
}
}
vmAdd() {
VM.add(this.vmdata, "data");
}
@@ -225,7 +260,16 @@ export class SingletonModuleComp extends ecs.Comp {
// 基础信息
h.name = heroAttrs.hero_name;
h.type = heroAttrs.type;
h.lv = heroAttrs.lv;
// 防止 ECS 旧数据覆盖 VM 新数据 (如果 VM 里的等级更高,说明刚升级还没同步到 ECS)
if (heroAttrs.lv > h.lv) {
h.lv = heroAttrs.lv;
} else if (h.lv > heroAttrs.lv) {
// 此时应该反向同步?或者等待 CanUpdateLv 事件处理
// 这里暂时保持 VM 的高等级,不被 ECS 覆盖
} else {
h.lv = heroAttrs.lv;
}
// 动态属性
h.hp = Math.floor(heroAttrs.hp);
@@ -241,10 +285,6 @@ export class SingletonModuleComp extends ecs.Comp {
h.crt = Math.floor(heroAttrs.Attrs[Attrs.CRITICAL] || 0);
h.as = Math.floor(heroAttrs.Attrs[Attrs.AS] || 0);
}
updateHeroExp(exp:number){
this.vmdata.hero.exp += exp;
this.vmdata.hero.exp_pre =Math.floor(this.vmdata.hero.exp/this.vmdata.hero.exp_max)
}
error(){
oops.gui.toast("数据处理异常,请重试或重新登录")
}