refactor: 统一货币更新逻辑,修复奖励发放流程
1. 重构奖励发放代码,移除重复的金币持久化逻辑,统一使用updateGold方法 2. 新增钻石VM绑定字段与updateDiamond方法,实现金银币统一管理 3. 新增货币镜像同步方法syncCurrencyToView,维护持久层与视图层数据一致性 4. 修复两个奖励道具预制体的count_label绑定配置
This commit is contained in:
@@ -878,7 +878,9 @@
|
|||||||
"__prefab": {
|
"__prefab": {
|
||||||
"__id__": 37
|
"__id__": 37
|
||||||
},
|
},
|
||||||
"count_label": null,
|
"count_label": {
|
||||||
|
"__id__": 31
|
||||||
|
},
|
||||||
"_id": ""
|
"_id": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -894,6 +896,7 @@
|
|||||||
"__id__": 0
|
"__id__": 0
|
||||||
},
|
},
|
||||||
"fileId": "47Sc4S8E5EfJ3uZtG97byB",
|
"fileId": "47Sc4S8E5EfJ3uZtG97byB",
|
||||||
|
"instance": null,
|
||||||
"targetOverrides": null
|
"targetOverrides": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -713,7 +713,9 @@
|
|||||||
"__prefab": {
|
"__prefab": {
|
||||||
"__id__": 31
|
"__id__": 31
|
||||||
},
|
},
|
||||||
"count_label": null,
|
"count_label": {
|
||||||
|
"__id__": 25
|
||||||
|
},
|
||||||
"_id": ""
|
"_id": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -729,6 +731,7 @@
|
|||||||
"__id__": 0
|
"__id__": 0
|
||||||
},
|
},
|
||||||
"fileId": "10z6GxEehAebPrefUJTgkq",
|
"fileId": "10z6GxEehAebPrefUJTgkq",
|
||||||
|
"instance": null,
|
||||||
"targetOverrides": null
|
"targetOverrides": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -211,7 +211,8 @@ export class SingletonModuleComp extends ecs.Comp {
|
|||||||
achieved_highlights: [],
|
achieved_highlights: [],
|
||||||
} as GameScoreStats,
|
} as GameScoreStats,
|
||||||
|
|
||||||
gold: 0, // 金币数据(MVVM绑定字段)
|
gold: 0, // 金币数据(MVVM绑定字段,镜像 data.gold)
|
||||||
|
diamond: 0, // 钻石数据(MVVM绑定字段,镜像 data.diamond)
|
||||||
switch_effect: true, // 音效开关(MVVM绑定字段)
|
switch_effect: true, // 音效开关(MVVM绑定字段)
|
||||||
switch_music: true, // 音乐开关(MVVM绑定字段)
|
switch_music: true, // 音乐开关(MVVM绑定字段)
|
||||||
};
|
};
|
||||||
@@ -303,13 +304,24 @@ export class SingletonModuleComp extends ecs.Comp {
|
|||||||
Object.assign(this.data, cloudData.data);
|
Object.assign(this.data, cloudData.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触发UI更新
|
// 触发UI更新(同步镜像层 + 事件)
|
||||||
|
this.syncCurrencyToView();
|
||||||
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE);
|
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE);
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
mLogger.error(this.debugMode, 'SMC', `[SMC]: 数据覆盖失败:`, 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() {
|
getGameDate() {
|
||||||
let data: GameDate = {
|
let data: GameDate = {
|
||||||
...this.data,
|
...this.data,
|
||||||
@@ -318,8 +330,29 @@ export class SingletonModuleComp extends ecs.Comp {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 变更金币(正数获得 / 负数消耗),以 data 为权威源并镜像到 vmdata。
|
||||||
|
* @param gold 变动量
|
||||||
|
* @param is_sync 是否标记脏并触发云端/本地同步
|
||||||
|
*/
|
||||||
updateGold(gold: number, is_sync: boolean = true) {
|
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) {
|
if (is_sync) {
|
||||||
gameDataSync.markDataDirty();
|
gameDataSync.markDataDirty();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -560,8 +560,7 @@ export class VictoryComp extends CCComp {
|
|||||||
|
|
||||||
// 3. 落地发放
|
// 3. 落地发放
|
||||||
if (gold > 0) {
|
if (gold > 0) {
|
||||||
smc.data.gold = (smc.data.gold || 0) + gold; // 持久化(存档口径)
|
smc.updateGold(gold); // 统一入口:改 data 持久层 + 镜像 vmdata + 标脏同步
|
||||||
smc.updateGold(gold); // 驱动 MVVM 展示
|
|
||||||
}
|
}
|
||||||
if (talentExp > 0) {
|
if (talentExp > 0) {
|
||||||
smc.addTalentExp(talentExp);
|
smc.addTalentExp(talentExp);
|
||||||
|
|||||||
Reference in New Issue
Block a user