update:训练难度展示ui完成
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
// 难度页当前用于保存“开始训练前上下文”的本地存储 key。
|
||||
export const trainingDifficultyStorageKey = "training-selection";
|
||||
|
||||
// 当前是页面联调用的模拟数据:
|
||||
// 1. 总难度 20 级
|
||||
// 2. 已解锁到 Lv3
|
||||
// 3. 前三关展示不同完成进度
|
||||
const totalDifficultyLevel = 20;
|
||||
const mockedUnlockedDifficultyId = "lv3";
|
||||
const mockedDifficultyProgressMap = {
|
||||
lv1: 100,
|
||||
lv2: 90,
|
||||
lv3: 70,
|
||||
};
|
||||
|
||||
const modeList = [
|
||||
{
|
||||
key: "endurance",
|
||||
title: "耐力训练",
|
||||
},
|
||||
{
|
||||
key: "precision",
|
||||
title: "精准训练",
|
||||
},
|
||||
{
|
||||
key: "rhythm",
|
||||
title: "节奏训练",
|
||||
},
|
||||
{
|
||||
key: "basic",
|
||||
title: "基础训练",
|
||||
},
|
||||
{
|
||||
key: "power",
|
||||
title: "力量训练",
|
||||
},
|
||||
{
|
||||
key: "focus",
|
||||
title: "专注训练",
|
||||
},
|
||||
];
|
||||
|
||||
const createDifficultyId = (level) => `lv${level}`;
|
||||
|
||||
const createDifficultyLabel = (level) => `Lv${level}`;
|
||||
|
||||
// 根据等级生成模拟文案,方便一次性扩展到更多关卡。
|
||||
const createDifficultySummary = (level) => {
|
||||
return [
|
||||
`箭靶划分为${Math.min(1 + Math.floor((level - 1) / 5), 4)}个区域`,
|
||||
`需${4 + level}次命中目标`,
|
||||
`${100 + Math.floor((level - 1) / 2) * 10}秒内完成所有射击`,
|
||||
"需使用20CM全环靶",
|
||||
];
|
||||
};
|
||||
|
||||
// 难度页的节点位置已经在页面内统一计算,
|
||||
// 这里保留最核心的 id / label 即可,不再维护无效的 left / top / style 字段。
|
||||
const createDifficultyNode = (level) => {
|
||||
return {
|
||||
id: createDifficultyId(level),
|
||||
label: createDifficultyLabel(level),
|
||||
};
|
||||
};
|
||||
|
||||
const createDifficultyDetail = (level) => {
|
||||
const id = createDifficultyId(level);
|
||||
const label = createDifficultyLabel(level);
|
||||
|
||||
return {
|
||||
id,
|
||||
label,
|
||||
title: `${label}难度`,
|
||||
summary: createDifficultySummary(level),
|
||||
startText: "开始",
|
||||
targetPaperType: "20CM全环靶",
|
||||
};
|
||||
};
|
||||
|
||||
// 所有训练模式当前共用同一套难度定义。
|
||||
const sharedDifficultyNodes = Array.from(
|
||||
{ length: totalDifficultyLevel },
|
||||
(_, index) => createDifficultyNode(index + 1)
|
||||
);
|
||||
|
||||
const sharedDifficultyDetails = Object.fromEntries(
|
||||
Array.from({ length: totalDifficultyLevel }, (_, index) => {
|
||||
const detail = createDifficultyDetail(index + 1);
|
||||
return [detail.id, detail];
|
||||
})
|
||||
);
|
||||
|
||||
const createModeConfig = ({ key, title, reward = null }) => {
|
||||
return {
|
||||
key,
|
||||
title,
|
||||
nodes: sharedDifficultyNodes,
|
||||
details: sharedDifficultyDetails,
|
||||
activeDifficultyId: mockedUnlockedDifficultyId,
|
||||
progressMap: mockedDifficultyProgressMap,
|
||||
reward,
|
||||
};
|
||||
};
|
||||
|
||||
// 难度页数据源入口:
|
||||
// 页面通过 getTrainingDifficultyModeConfig(modeKey) 获取当前模式完整配置。
|
||||
export const trainingDifficultyModeMap = Object.fromEntries(
|
||||
modeList.map((mode) => [mode.key, createModeConfig(mode)])
|
||||
);
|
||||
|
||||
export const getTrainingDifficultyModeConfig = (modeKey) => {
|
||||
return trainingDifficultyModeMap[modeKey] || trainingDifficultyModeMap.precision;
|
||||
};
|
||||
Reference in New Issue
Block a user