Files
slide_block/assets/scripts/LevelManager.ts
1970-01-01 08:27:52 +08:00

132 lines
4.0 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { sys } from "cc";
import { LevelConfig } from "./LevelBuilder";
import { BoardShapeName } from "./BoardShape";
export class LevelManager {
private static _instance: LevelManager;
public static get instance() {
if (!this._instance) this._instance = new LevelManager();
return this._instance;
}
private levelIndex: number = 0;
private unlockedLevels: number = 1; // 已解锁关卡数
private STORAGE_KEY = "MY_GAME_PROGRESS";
private TUTORIAL_KEY = "TUTORIAL_COMPLETED";
// 预设关卡配置表(可以继续扩展) //rectangle L_shape T_shape cross_shape
private levels: LevelConfig[] = [
{ currentShape: "rectangle", blockSize: 100, tileTypes: 5 },
{ currentShape: "L_shape", blockSize: 90, tileTypes: 4 },
{ currentShape: "T_shape", blockSize: 80, tileTypes: 3 },
{ currentShape: "cross_shape", blockSize: 70, tileTypes: 3 },
{ currentShape: "diamond", blockSize: 80, tileTypes: 4 },
];
constructor() {
this.loadProgress();
}
public isTutorialCompleted(): boolean {
return sys.localStorage.getItem(this.TUTORIAL_KEY) === "true";
}
public setTutorialCompleted() {
sys.localStorage.setItem(this.TUTORIAL_KEY, "true");
}
public getTutorialLevel(): LevelConfig {
return {
isTutorial: true,
tileTypes: 2,
blockSize: 120,
fixedBoard: [
[0, 0, -1],
[1, -1, 1]
]
};
}
public getCurrentLevel(): LevelConfig {
if (!this.isTutorialCompleted()) {
return this.getTutorialLevel();
}
if (this.levelIndex < this.levels.length) {
return this.levels[this.levelIndex];
}
console.log('随机关卡')
return this.generateRandomLevel(this.levelIndex + 1);
}
public nextLevel(): LevelConfig | null {
if (!this.isTutorialCompleted()) {
this.setTutorialCompleted();
this.levelIndex = 0;
this.saveProgress();
return this.getCurrentLevel();
}
this.levelIndex++;
this.saveProgress();
return this.getCurrentLevel();
}
public reset() {
this.levelIndex = 0;
this.unlockedLevels = 1;
this.saveProgress();
// 重置时是否重置教学?通常不用,除非显式清除数据
// sys.localStorage.removeItem(this.TUTORIAL_KEY);
}
/** 本地存储进度 */
private saveProgress() {
const data = {
levelIndex: this.levelIndex,
unlockedLevels: this.unlockedLevels,
};
sys.localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
}
/** 读取本地存储 */
private loadProgress() {
const json = sys.localStorage.getItem(this.STORAGE_KEY);
if (json) {
try {
const data = JSON.parse(json);
this.levelIndex = data.levelIndex ?? 0;
this.unlockedLevels = data.unlockedLevels ?? 1;
// 如果是老玩家已解锁超过1关跳过教学
if (this.unlockedLevels > 1 && !this.isTutorialCompleted()) {
this.setTutorialCompleted();
}
} catch (e) {
console.warn("进度解析失败, 重置进度");
this.reset();
}
}
}
private generateRandomLevel(id: number): LevelConfig {
const allShapes: BoardShapeName[] = ["rectangle", "L_shape", "T_shape", "cross_shape", "diamond"];
// 随机选一个形状
const shape = allShapes[Math.floor(Math.random() * allShapes.length)];
// 随机决定方块种类 (6~12)
const tileTypes = 5;
// const tileTypes = 6 + Math.floor(Math.random() * 7);
// 随机大小 (70~100)
const blockSize = 70 + Math.floor(Math.random() * 31);
return {
currentShape: shape,
tileTypes,
blockSize,
};
}
}