refactor: 统一货币更新逻辑,修复奖励发放流程

1. 重构奖励发放代码,移除重复的金币持久化逻辑,统一使用updateGold方法
2. 新增钻石VM绑定字段与updateDiamond方法,实现金银币统一管理
3. 新增货币镜像同步方法syncCurrencyToView,维护持久层与视图层数据一致性
4. 修复两个奖励道具预制体的count_label绑定配置
This commit is contained in:
pan
2026-09-01 15:46:56 +08:00
parent 6608cedb08
commit 2d13427d7d
4 changed files with 45 additions and 7 deletions

View File

@@ -211,7 +211,8 @@ export class SingletonModuleComp extends ecs.Comp {
achieved_highlights: [],
} as GameScoreStats,
gold: 0, // 金币数据(MVVM绑定字段)
gold: 0, // 金币数据(MVVM绑定字段,镜像 data.gold)
diamond: 0, // 钻石数据(MVVM绑定字段,镜像 data.diamond)
switch_effect: true, // 音效开关(MVVM绑定字段)
switch_music: true, // 音乐开关(MVVM绑定字段)
};
@@ -303,13 +304,24 @@ export class SingletonModuleComp extends ecs.Comp {
Object.assign(this.data, cloudData.data);
}
// 触发UI更新
// 触发UI更新(同步镜像层 + 事件)
this.syncCurrencyToView();
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE);
} catch (error) {
mLogger.error(this.debugMode, 'SMC', `[SMC]: 数据覆盖失败:`, error);
}
}
/**
* 将 data 层的货币镜像到 vmdata 视图层(MVVM 绑定字段)。
* Why: data 为云端持久权威源,vmdata.gold/diamond 仅供界面绑定展示;
* 登录覆盖、奖励发放后都必须调用本方法保持镜像一致。
*/
public syncCurrencyToView(): void {
this.vmdata.gold = this.data.gold ?? 0;
this.vmdata.diamond = this.data.diamond ?? 0;
}
getGameDate() {
let data: GameDate = {
...this.data,
@@ -318,8 +330,29 @@ export class SingletonModuleComp extends ecs.Comp {
return data;
}
/**
* 变更金币(正数获得 / 负数消耗),以 data 为权威源并镜像到 vmdata。
* @param gold 变动量
* @param is_sync 是否标记脏并触发云端/本地同步
*/
updateGold(gold: number, is_sync: boolean = true) {
this.vmdata.gold += gold;
this.data.gold = Math.max(0, (this.data.gold ?? 0) + gold);
this.vmdata.gold = this.data.gold;
if (is_sync) {
gameDataSync.markDataDirty();
}
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE)
return true
}
/**
* 变更钻石(正数获得 / 负数消耗),以 data 为权威源并镜像到 vmdata。
* @param diamond 变动量
* @param is_sync 是否标记脏并触发云端/本地同步
*/
updateDiamond(diamond: number, is_sync: boolean = true) {
this.data.diamond = Math.max(0, (this.data.diamond ?? 0) + diamond);
this.vmdata.diamond = this.data.diamond;
if (is_sync) {
gameDataSync.markDataDirty();
}