feat(英雄系统): 实现英雄升级和经验系统
- 在 HeroViewComp 中扩展怪物死亡事件数据,包含等级和类型信息 - 在 SingletonModuleComp 中实现完整的经验计算和升级逻辑 - 在 MissionComp 中添加经验获取和升级事件处理 - 在 RogueConfig 中添加经验计算公式和怪物经验配置 - 添加等级同步机制防止ECS数据覆盖
This commit is contained in:
@@ -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("数据处理异常,请重试或重新登录")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user