refactor: 统一货币更新逻辑,修复奖励发放流程
1. 重构奖励发放代码,移除重复的金币持久化逻辑,统一使用updateGold方法 2. 新增钻石VM绑定字段与updateDiamond方法,实现金银币统一管理 3. 新增货币镜像同步方法syncCurrencyToView,维护持久层与视图层数据一致性 4. 修复两个奖励道具预制体的count_label绑定配置
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user