完善关卡逻辑

This commit is contained in:
2025-05-19 19:51:17 +08:00
parent d51c122d57
commit e9e60706a4
23 changed files with 792 additions and 113 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

View File

@@ -0,0 +1,6 @@
{
"uuid": "2b4d26c7-ae87-47a3-8084-29a243441634",
"importer": {
"textureType": 2
}
}

View File

@@ -20,17 +20,31 @@
}
],
"_$child": [
{
"_$id": "4udntov4",
"_$type": "Image",
"name": "mask",
"width": 1080,
"height": 1920,
"alpha": 0.4,
"left": 0,
"right": 0,
"top": 0,
"bottom": 0,
"skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609",
"color": "#000000"
},
{
"_$id": "jzxgx41i",
"_$type": "Box",
"name": "offset",
"y": 560,
"y": 3000,
"width": 1080,
"height": 1360,
"_mouseState": 2,
"left": 0,
"right": 0,
"bottom": 0,
"bottom": -2440,
"_$child": [
{
"_$id": "bd1s5tvm",
@@ -130,6 +144,14 @@
"x": 72,
"width": 936,
"height": 144,
"_$comp": [
{
"_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46",
"scriptPath": "../src/views/CommonData.ts",
"intValue": 0,
"strValue": ""
}
],
"_$child": [
{
"_$id": "590euu2q",
@@ -137,6 +159,7 @@
"name": "Sprite",
"width": 936,
"height": 144,
"mouseThrough": true,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",
@@ -179,6 +202,14 @@
"y": 194,
"width": 936,
"height": 144,
"_$comp": [
{
"_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46",
"scriptPath": "../src/views/CommonData.ts",
"intValue": 0,
"strValue": ""
}
],
"_$child": [
{
"_$id": "yjk1xq2a",
@@ -186,6 +217,7 @@
"name": "Sprite",
"width": 936,
"height": 144,
"mouseThrough": true,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",
@@ -228,6 +260,14 @@
"y": 388,
"width": 936,
"height": 144,
"_$comp": [
{
"_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46",
"scriptPath": "../src/views/CommonData.ts",
"intValue": 0,
"strValue": ""
}
],
"_$child": [
{
"_$id": "nfk6pjgd",
@@ -235,6 +275,7 @@
"name": "Sprite",
"width": 936,
"height": 144,
"mouseThrough": true,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",
@@ -277,6 +318,14 @@
"y": 582,
"width": 936,
"height": 144,
"_$comp": [
{
"_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46",
"scriptPath": "../src/views/CommonData.ts",
"intValue": 0,
"strValue": ""
}
],
"_$child": [
{
"_$id": "nogfpbyx",
@@ -284,6 +333,7 @@
"name": "Sprite",
"width": 936,
"height": 144,
"mouseThrough": true,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",
@@ -326,6 +376,14 @@
"y": 776,
"width": 936,
"height": 144,
"_$comp": [
{
"_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46",
"scriptPath": "../src/views/CommonData.ts",
"intValue": 0,
"strValue": ""
}
],
"_$child": [
{
"_$id": "2unm1bxx",
@@ -333,6 +391,7 @@
"name": "Sprite",
"width": 936,
"height": 144,
"mouseThrough": true,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",

View File

@@ -14,9 +14,15 @@
{
"_$type": "f2970e4d-7a09-4a9b-aef3-45d330c86f4f",
"scriptPath": "../src/views/Home.ts",
"btn_start": {
"btn_new_blue": {
"_$ref": "6irhm6t7"
},
"btn_continue": {
"_$ref": "9rcb0wtp"
},
"btn_new_white": {
"_$ref": "n4ggvqc0"
},
"btn_clean": {
"_$ref": "mdqfz48j"
}
@@ -36,16 +42,34 @@
"skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609",
"color": "#f5f7fb"
},
{
"_$id": "vxgd702p",
"_$type": "Label",
"name": "Label",
"x": 144,
"y": 760,
"width": 792,
"height": 400,
"centerX": 0,
"centerY": 0,
"text": "Classic\nSudoku",
"fontSize": 100,
"color": "rgba(123, 129, 140, 1)",
"bold": true,
"align": "center",
"valign": "middle",
"padding": "0,0,0,0"
},
{
"_$id": "6irhm6t7",
"_$type": "Box",
"name": "btn_start",
"name": "btn_new_blue",
"x": 144,
"y": 1464,
"y": 1488,
"width": 792,
"height": 168,
"centerX": 0,
"centerY": 588,
"centerY": 612,
"_$child": [
{
"_$id": "ry13plzy",
@@ -88,6 +112,142 @@
}
]
},
{
"_$id": "9rcb0wtp",
"_$type": "Box",
"name": "btn_continue",
"x": 144,
"y": 1376,
"width": 792,
"height": 168,
"centerX": 0,
"centerY": 500,
"_$child": [
{
"_$id": "vfod7fmk",
"_$type": "Sprite",
"name": "Sprite",
"width": 792,
"height": 168,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",
"x": 0,
"y": 0,
"width": 1,
"height": 1,
"lt": 20,
"rt": 20,
"lb": 20,
"rb": 20,
"percent": true,
"lineWidth": 1,
"fillColor": "rgba(29, 92, 220, 1)"
}
]
},
{
"_$id": "f8ylua31",
"_$type": "Label",
"name": "Label",
"y": -32,
"width": 792,
"height": 168,
"centerX": 0,
"centerY": -32,
"text": "Continue",
"fontSize": 80,
"color": "#FFFFFF",
"bold": true,
"align": "center",
"valign": "middle",
"padding": "0,0,0,0"
},
{
"_$id": "pr17wcli",
"_$type": "Image",
"name": "time",
"x": 227,
"y": 107,
"width": 35,
"height": 35,
"centerX": -152,
"centerY": 40,
"skin": "res://2b4d26c7-ae87-47a3-8084-29a243441634",
"useSourceSize": true,
"color": "#ffffff",
"_$child": [
{
"_$id": "2l5pfddm",
"_$type": "Label",
"name": "label_time",
"x": 55,
"y": -2,
"width": 400,
"height": 35,
"text": "99:00:00-Hard",
"fontSize": 40,
"color": "rgba(255, 255, 255, 0.6078431372549019)",
"bold": true,
"valign": "middle",
"padding": "0,0,0,0"
}
]
}
]
},
{
"_$id": "n4ggvqc0",
"_$type": "Box",
"name": "btn_new_white",
"x": 144,
"y": 1598,
"width": 792,
"height": 168,
"centerX": 0,
"centerY": 722,
"_$child": [
{
"_$id": "sez4l9sx",
"_$type": "Sprite",
"name": "Sprite",
"width": 792,
"height": 168,
"_gcmds": [
{
"_$type": "DrawRoundRectCmd",
"x": 0,
"y": 0,
"width": 1,
"height": 1,
"lt": 20,
"rt": 20,
"lb": 20,
"rb": 20,
"percent": true,
"lineWidth": 1,
"fillColor": "rgba(255, 255, 255, 1)"
}
]
},
{
"_$id": "ihe7vkr1",
"_$type": "Label",
"name": "Label",
"width": 792,
"height": 168,
"centerX": 0,
"centerY": 0,
"text": "New Game",
"fontSize": 100,
"color": "rgba(29, 92, 220, 1)",
"bold": true,
"align": "center",
"valign": "middle",
"padding": "0,0,0,0"
}
]
},
{
"_$id": "mdqfz48j",
"_$type": "Box",

View File

@@ -1,9 +1,20 @@
import { StorageManager } from "./models/StorageManager";
import { LevelManager } from "./models/LevelManager";
const { regClass, property } = Laya;
@regClass()
export class Main extends Laya.Script {
onStart() {
console.log("Game start");
onAwake() {
console.log("Game awake");
LevelManager.getInstance().init()
StorageManager.getInstance().init()
}
onLateUpdate(): void {
StorageManager.getInstance().saveStage()
}
}

View File

@@ -4,17 +4,25 @@ export const config = {
BREAK_POINT: 1, // 竖版和横版的分界宽度
DEBUG: false,
DEBUG: true,
OPEN_GUIDE: true,
MISTAKE_MAX: 3,//最大错误数
STAGE_TYPE: {//关卡类型
MAIN: 1,//主线
DC: 2,//每日挑战
},
DEFAULT_STAGE_ID: "main",//主线关卡标识
DIFFICULTY_TYPE: {//难度
Easy: 1,
Medium: 2,
Hard: 3,
Expert: 4,
Extreme: 5,
Easy: "Easy",
Medium: "Medium",
Hard: "Hard",
Expert: "Expert",
Extreme: "Extreme",
},
BLOCK_COLOR: {

View File

@@ -7,5 +7,6 @@ export const respath = {
gamedone_ui_res: "resources/GameDone.lh",
score_add_ui_res: "resources/ScoreAdd.lh",
difficulty_ui_res: "resources/Difficulty.lh",
}

View File

@@ -3,6 +3,7 @@
import { StorageManager } from "./StorageManager"
import { DOBlock } from "./DOBlock"
import { DataBlock, DataUndo, DataStage } from "../types/global"
import { LevelManager } from "./LevelManager"
export class DOStage {
@@ -13,7 +14,7 @@ export class DOStage {
private letterToNumber: Map<string, number>;
private numberToLetter: Map<number, string>;
constructor(dataStage: DataStage, levelStr: string) {
constructor(dataStage: DataStage) {
this.data = dataStage
this.letterToNumber = new Map();
@@ -44,8 +45,9 @@ export class DOStage {
blockMap.set(dataBlock.index, dataBlock)
}
if (levelStr.length != 81) {
console.log("levelStr error", levelStr.length)
var levelStr = LevelManager.getInstance().getLevelStr(this.data.difficulty, this.data.index)
if (!levelStr || levelStr.length != 81) {
console.log("levelStr error", this.data.difficulty, this.data.index, levelStr)
}
var list = new Map();
for (var i=0; i<levelStr.length; i++) {
@@ -79,12 +81,26 @@ export class DOStage {
}
}
}
public getData(): DataStage {
return this.data
}
//====================================持久化数据
public get_difficulty(): number {
public get_stageID(): string {
return this.data.id
}
public get_stageType(): number {
return this.data.type
}
public get_stageName(): string {
return this.data.name
}
public get_difficulty(): string {
return this.data.difficulty
}
public get_stageIndex(): number {
return this.data.index
}
public get_mistake(): number {
return this.data.mistake
@@ -99,7 +115,7 @@ export class DOStage {
}
public set_duration(duration: number): void {//关卡计时
this.data.duration = duration
// StorageManager.getInstance().onChanged()
StorageManager.getInstance().onChanged()
}
public get_note_open(): boolean {

70
src/models/DOUser.ts Normal file
View File

@@ -0,0 +1,70 @@
import { DataProgress, DataUser } from "../types/global";
import { StorageManager } from "./StorageManager"
export class DOUser {
private data: DataUser
constructor(dataUser: DataUser) {
this.data = dataUser
}
public getData(): DataUser {
return this.data
}
//====================================持久化数据
public get_isCompletedMain(): boolean {
return this.data.isCompletedMain
}
public set_isCompletedMain(isCompletedMain: boolean): void {
this.data.isCompletedMain = isCompletedMain
StorageManager.getInstance().saveUser()
}
public get_dones(): Array<string> {
return this.data.dones
}
public add_done(stageID: string): void {
if (this.data.dones.indexOf(stageID) < 0) {
this.data.dones.push(stageID)
StorageManager.getInstance().saveUser()
}
}
public get_progress(difficulty: string): number {
var find: DataProgress
for (var i=0; i<this.data.progresses.length; i++) {
var obj = this.data.progresses[i]
if (obj.difficulty == difficulty) {
find = obj
break
}
}
if (find) {
return find.index
}
return 0
}
public update_progress(difficulty: string, index: number): void {
var find: DataProgress
for (var i=0; i<this.data.progresses.length; i++) {
var obj = this.data.progresses[i]
if (obj.difficulty == difficulty) {
find = obj
break
}
}
if (find) {
find.index = index
}
else {
find = {difficulty: difficulty, index: index}
this.data.progresses.push(find)
}
StorageManager.getInstance().saveUser()
}
//====================================持久化数据
}

View File

@@ -0,0 +1,3 @@
{
"uuid": "fc4cb9cd-3bc4-47e8-bfd4-6adbaea331b8"
}

151
src/models/LevelManager.ts Normal file
View File

@@ -0,0 +1,151 @@
import { config } from "../constants/config"
const Easy = [
"aBCeIGFhdEDFcAHBGIhigBdfecAgHDiFBCaeBEAGHCIdffcIdEAHbgcABfGEdiHIFHaCDGEBDGEHbiaFC",
"abecfIgdhdICGhbAFEHGfeAdIcBCFAbigEHDGDhFeABICIEbHdCFGAFaGDBHcEIbCDIGehAFeHIaCFdbG",
"AbIGdeHFCHFDbCieaGgEcfaHbDIEiAdBFGcHFHGcEAIBddCBHIGFEaCdfiGBAHEbgeAHCDIfIaHefdCgB",
"ACEdBIGHFBHGFacDEIdiFheGAbCcEiBdFHaGhfBGIAecDGadcHeIfBIgCaFHbDEFdAegbcIHEBHICDfGa",
"acEIhbgFDFIDAgEBHCBGHfCdeaIDEaBFgicHcFGHAidebIHbDecaGFeBFCIAHdGGDCebHfIAHAiGdfCBE",
"aCfDbGHIEGHBIcEFdaedIAFhbCGDFahGiebCHbecaDIGFiGCbEFdAHBEHGIcAfDFiGedACHBCAdFHBgei",
"ACGBfIHDeHEBCdgFAIfdIHaegcBDgEAHCIBFIbhFEdaGCcAFGIbDEHgIDebHcfabHADcFEiGEfcigABHd",
"AcGFdihBEdHEbGCAifBFIEhaGDCEgADIBfcHhibGcfDEaFDChaEigbGBHCFdEAIIEdabHCFGcAfIEGbHD",
"ACGIFbEhdbFEDGhaCIIHDCAEBGFFAIHBDceggdbecfIahHEcAIGdFBeIHFDAGBcdGFbeCHIacbAgHifdE",
]
const Medium = [
"achEDIBFGgeIHbFaDCFDBaCGHeIbHaceDGiFCIFGHBeadeGDIFAChbDAGbIeFCHhfEdGCIbaiBcFAhdGE",
"ADBeIGhFCGhCDFabiefiECHBgDACGDbaFieHEBIHGCFADhFAIedCbGdAFGbheCIbEhaciDGFIcGFDeaHb",
"aDBIEcHFGEGHbDFcaiIFCAGHeDbgHdEIafBCCIaHFbdGeBefGcdIHADCGFbeAIHhbedAIGcFFaIcHgBEd",
"AdEGCHfibHGbefIacdCIFABdehgICgHDAbFefahbecDgIEBDIGFCAHbeICAGHDFGFCDheIbADHAFIBGec",
"ADeIBFgHCIHFcgabdebGCeDhaIfHfaDeIcGbgIBFacHEdECdBHGFaiFBHAIEDcGDeGHcBiFaCAIgFDEBH",
"aDFIEHbcGciHaGbFDEeGBcdFHIAbeadhCgfIGHIfBEcAdFCdGAIeHBDAeHcgibFHFGbIDaECIBcEFADGh",
"aDgEICFBHHCFdGBAeIIEBFHacdgcAEgBIdhFDGhCFEiabBFIADHEGCGbciaDHfEEHdbcFgiAFiAHeGbcd",
"adHEbCIfGegBfHIDAcIcfgDaHEBDFABIGcHEHIcdfegbaBEGcAHFdIFAdIgBeCHCbihEFAGdghEACDBIF",
"aecDbHIGFDGHCFIBEAfiBEGaHCdgAFBIedHcHCEaDFGBIbDIghCFAeibahcdeFGcHdfeGAIBefGIAbCDH",
]
const Hard = [
"AEdfiHgCBIFGECbahdcbHGADeIFGIFCDaBeHHDCbGEIFAeabhfICdgbCIAHFDGeFGadEcHBiDHeIBgFac",
"aEFGBihCdHcIefdGBAGdbcahIfeIBAFDcegHDHEAGBCiFFgcHIEadBeFHDCGBaicidBHAFEGbAGIeFDHC",
"AEGIdchFBFICbehgAdbHDFAGeIchdEgBaFCiGbfchIadeCAIefdbGHdfBaIeChGEGHdCFibAIcaHGbDEf",
"afbCGDehiIGhEaFCdBECDIbHAFGhEGADbfICdbifechGAFACHIGbeDgDFBHAIcEcIaDFeGBHBHegCIdaF",
"AFhIgCdEBcEGDBHAFIiDbfaeGCHhGIEcfbdafcdBIAHGEBaeHdGCIfEBACFdIHggHcAeiFbDdiFGHBEAC",
"agcfdHbEIHBDEIGCaFFiecBAhGDBEghcFIdaDHiAGbEfCCAFiEdGBHGCabfIdHeIDHgAEFCbEFBdHcAIg",
"agibdeFchcHDGIfeBAEFbHAcDIgiDCAEBGHFHBeDFGCaIFAGICHBdEgEaCBihfdbIfeHDAGCdCHFGaIeb",
"AHbIEDcGFCifgHBAdeGEDAfcIHBBdGHCEFaiIFcbdaHeGHaeFIGBCDeBAcGFdIhFGHDaieBcDcIebhGFA",
"AHEbCIGfdiBGDEFHCAdfcHGaBIEBGICfdaeHhCFEAbIdGEAdihgFbcFIAgDECHbcdBAIHegfGEHFbcdAI",
"AHECBgFdIBIGDAfhCECfDHIEagbIGHEDcBFAEBFAGichddCaBFHeigFEIgHadbChDcIeBGaFGabFcdiEH",
]
const Expert = [
"AHEIDCFGBiBFGaedchcdghbfIEADfHEIACBgbeADCGHfiGCibFHaDEeaBcHDGIFHIdFgBeAcFGCaeIBhD",
"AHEIFGcbDDgBacefhIFIcBdHGeACbdHIFAgehfgEAcIDbEaIGBDHFCIEAFGbdcHBDFchaeiGgCHDEIbAF",
"aIBCFDeHGcGFHaeIdbdHEIGBafCFDGahcbieBeaGDIHcFICHEBfdGAHADFEgcbIgBIdcaFEHEFCbiHGAd",
"AIBHEFDcGEFcaDGihbHDGBCIAefGHFiadEBCBCAeFHGIdIEDGBcHFaCAiFGebdhfbHdIaCgedgECHbfAi",
"aiDHBEfCGCGEFIdhBABFHCaGEdiIDGEHbcAfHABifcdgeECFgDaIHBFBaDEHGiCdECbGIafHGhiacFBed",
"aIgdfbhcEdBEHCiGFAFCHEGaBdIIFbCAGDEHcHABDeFigegdIHFCabBDiFEHAGcHACGIDEBFGefabcihd",
"AIGdFebCHBfHiaCdGEEDcgHbIaFgcBfeAHIdiHecgDfBAfaDbIhgeccbfaDIeHGhGIECFadbdeAHBGCFI",
"baDEHGIFCGIHDCfABEceFAIBgdhfdchGIEABIgAbdEHcFEHbfaCDGIABeGFhciddFiCEabhGHCgIBdFEA",
"baicHdegFHEdIFGcABGFCaebhidfbadGCIHEICEfAhBDGdGHBIeaFCAHBEDfGCICDGHBifEaeiFGCADBh",
"BaiGFcdEHdFCHEAIGBhEgbDIcfaCidFAeBHGFBACGhEIdghEDibAcfEdBIHFgAcaGHECdFBIICfabGHDe",
"bCFIGHADeHAGdFebCIDIEaBcFGHEbHGAFDIcgdCbhieFaafiCEDHBGCEBHdGIafIHAFcbgeDfgDeiACHb",
"BdaHFIEGCicHDgEafBEGFBACDIHfbDcEgIHAHAIFBdgceCeGihAbDFDIbEchFaggFCadbHEIaHEGIfcBD",
"BDCEFiGAHIHacGBeDFGEFHADIBcEIdfHACgBhCGbDEaFIFABgicdHeaFhiEgbCdDbiaChfeGCGEdbFHIa",
"bdEcFAHIGCAIegHFBDFGHBDICaEehfaBDIGCDCgiHeaFBIBAFcgedhaicgEbDHFGeDhAFbcIHFbDiCGEa",
"BEaihfcdgCFIGEDAHBgDHACBIFeFIdhaeGbcAHGcBIDEfebcdFGHAIDgeBIHFCaHCbFGAeiDIAfEdcbGH",
"BehdIcaFgCfGeAHIbdaIdfBGCheEgcIDFHAbdAFHeBGCiIHBGcaDefFCIBHdeGAHbeaGIFDCGDACfEBIH",
"BfHCEGADIIdchAFGbeGaEiBdCHFFBigCADEHHEGBdIfaCDCafhEiGBeGFDIHbCacHdaFBEiGaIbegcHFd",
]
const Extreme = [
"BGDiEAfchahcFBDIGEEIFhgCDabFAHGibedcDEGACHbIFCbIEdfGHagDACfEHBihFBDAIcegICEbHGaFd",
"BGFAIHDCEDHicegBAfEACFDbIGHidhbCEgFAaEGIhfcDBFCbgadeHIHIedGafBCcbdhFiAEGGFAEbcHID",
"BGFHIAdECaiCdBEFGHhDeFcgbaiGFBeAICHdICAGdHEFbdeHCFBGIAFhIBGDACEeBGaHcIDfcadiefhbg",
"BhAcGEIDFIGdBaFCHefeCHiDGbaeaBFcIdGHcDGEHAFIBhifgdBEACAcIDFHbEGGbHIEcaFDdFeabGhcI",
"BHeadfiCGICAgbHDEFdFgIEcHabgEHdFabICcadBHIfGEFBICGEAdHeiBFAGcHdHdCeIBGfAaGfHcDEBI",
"BHFcEdgaigIDAfbEHcCEaIGHBfDdfIGHCAeBhCBeIADGFAGedbFcihFdHBaGIceIacfDEHBGEbGHCIFdA",
"biADChGFEEHFIagbDCcGDBFEAHIIaeFHDCGBFBHgIcdEadcGebAhIFHfBAGIECDgDICEbFahaechdFibg",
"bICEGDHFAHFeaICdbGaDGbFHEcIEadfcgIHbFGHIbECAdICBhdAfGEcHiDAbgefGBFceiadhDEAGHFBIC",
"bieDFaGHcgcaeHiDbFHfDGcBiAECHIBgEFdaDGBHafEciAEFIDcbghFBcaIdheGIdHCEGAFBEAGFBHCID",
"BIFCAdhGeDhAEbgFCICEgFHiBDaFBEGDAIHCADHicBEfggciHFeDabHGDBicaefiacdeFGbHEFBaGHCID",
"bihCGEADfFAGIbDchEedCfahbigCFDEIGHbaIbEHdaFGCHGaBCfIEdGcFdHbeAIAEBGFIDcHdhIAEcGFB",
"CaBhedgfiidHcFGAEbEFGbiahCDAEIGDbFHcFGdIhcebahBCFaEDiGDHAECIBGFbCEdGFIAHGIfaBhCDE",
"cbFDEGiAHGIacFHdebdeHibAgFcfdIBCehGABHgAIFECdACEgHdfBIIGbFDCahEeAdHGBCIFHfceAIBDG",
"cbgHEaFdIaIdcbfGEHEHFigDBACbFEAIHdCGhcAEDGIBFDGIBFCehaGDCFABHIEiabGHecfdFehdcIaGB",
"CbhdAEIGfaEFgibCdhIGDHCFBEafDEBHaGICGibcfdhAehcAIeGFbddFIEbHAcGEHCagIDFBBAGfDCEHI",
"CDabGEHIFeFhIaCGDbbgIHdFcAEAcEGhbifdGIbCFdaEHdHfaEiBGciaDFCHEbghEgDbafCIFbceiGDha",
"cdgeAIBfhhbFDCgIAeAiEHbFcDGBFICGEdHAdGhBFaECIeACIdHGbfIedFHcagBGhbaEdficfCagiBHed",
"cDgIbFEAHehbdGaFICiafecHgDBACIGEBhfdgbdfhiCeAHFECAdbGIBIHAFedcgfGABdCIheDechIGabF",
"CEBIAFHGDIhAdEgbcfgFdCbheaIFGHACIDEbeBCGFdIhADaIbHEcFgBIEFGcAdHHdGEiaFbcAcFHDBgie",
"cEHGfdIABFIgCAbhedAbDeIHcGfeABFcGdHIHDFBEIACGigChdafbEbFaDHEgIcGCIAbfeDHDHeIGcBFA",
"ceIBaDGfhHaGcfiDEbBdFhGEIaCAHbFICEgDGiCdEahbFEfDGhbACIfbhEDGcIAiCeabHFdgdgaIcFBhe",
"CeiBaGHDfADGfeHIBCbFHidcegAdHCeFagIBIGECHBAFDFBAgIdcHEEaFHBIDcGgidacfBEHHCBdGefaI",
"cEIDAGFHbgDBEFhICAFHAIBCeGdbGFhIeadCACDBGFHIehIecDAGBFdacGEiBfHIfHAcbDEgEbgfhdCai",
"CFeabGHIDGBdHEIfcaihACDFBegEGIBadcHFbDcGFHEAIHAFEICgDBAcGihbDFEFIHdgeabcdebfCAIGH",
"CFEIAdbgHaHicbgDeFGDBEFhcIAeGHADCIfBIcFghbAdEBADFIEhcGFbcHGIeaDHEADCFGbidigBEaFHc",
"CGaBfHIdEHEiacDFBGDbFIgEHcaadcFBgEIHfhECDIGaBBiGHEadFcgCdEIBAHFiAbgHfCEdEFHdacBGI",
"CGhAIbfEDFAIEdhcBgDEBCGfHaIIDgbheACFHFcDaIbgeebAGFcIDHGCFibdEHABHDFEaGicaIeHcgDFB",
"cHbEFDGAIAdIcgBEFHegfhIAcbDHACbDGfieIbEACFDHgGFdIheACBBCaGEHidfdEhfaIBGcFIGDbCHEa",
"cidGHEBFAFaeBDcIGHbHgAFIECdgeIHafdbcAdfecbHIGHbCDIGAEFEFaCBHgDIDCbIGaFheighFEDCAB",
"cIFDHAEbgebHgicAfdaGDEFbhCIBDacGFIEHFHIABEGDCgcehdIFABdeGBAHCIFhfciEdbgAIABFCGDhe",
"CIFeBahdGHGDIcFebabaegDHIcfdhAbEcFGiIfcaHgdEbEBGDFIcAHFcbhaEgidaEIfGDBhCGdHciBAFE",
"DAeFBIHGcFiCHGeBadhGBadCFeIabgIHDECFIEDGCFabhChFBEAdIGbcadfGIHEEdhCiBgFAGfiEAHCdb",
"dafibcGHEHIEFdgcbaBCGAHEDIfeHcDgbfaIGBAHIFECDIFdEcAHGbaGBceDIfHFehGaIBdCCdIBfHAEG",
"DaFIcbHgebeHGDFAiccgiEAHDFBEBcAHgFDIGHdCfibEaIFabEdGcHHIGfBeCAdFCbDIAehGAdEHGcIBF",
"DaibFEGHCGHECIDaBFcFbGHaIDeHiAedbFcGEgFicHBAdBCDAgFheIIEHdAGcfBFDchBIEGAabgFecDiH",
"DaIbGFHeCFChaiebdGGeBdCHIFaCbGFADEHIHFAIEbGCdIDEcHgAbFBGcHDafiEEIFGbcdahahdEFiCGB",
"dAIcebGFHgBEHFaCiDhcFdgIAbeIDBFaGeHcCeAIDHFgBfGhBcEIdABFgAHCDEIAHdeIFBcGeICGbDhaf",
"dbFECIAgHIGaFDHBCeHEcAGbDiFFDBgheiacECGIAFHBDaIHDbceFGcHEbfaGDibfdHIGCEAgaiCEDFhb",
"DbgiCFaehcaehbdIGFHIfAEGCBDgfCeIHDABIHAbDCGFEEdbFGAhCIBEDcaiFHGaGHDfBEIcFciGhEbdA",
"DEbfcgaHIFaIHDbCegcHGaiEFbDAfebhdIGcidCEGABFHgBHcFIdAEhgfibceDaeIdGafHcBBCaDEhGIF",
"dEGHAfIbCBIHcEGFDACFABDIEGhFhbagCdIEEDCfibhAGGAIeHdBCFIGfdcHaEbHCeibaGFDAbdgFechI",
"DFACBhGIEgchaIeFDbBEIFDGaChAHFbgidEcedcHAfbGIIGbdecHAFFBGECDIHAcadIHbefGHiEgFACBD",
"dfbeahiCgECgiDbfHAAihGFCdeBGbFHCDEAihDIAgecBFcaEBIFgDHFGDCHaBIEIeADBGHFcBHcFEIaGd",
"dfeGchaIBICAFbeHgdgBHdAIfceCHIAeBGdfAGBIFDEHcFEDHGCIBaEDgcIFBAHHIfbdAceGbACehGDFi",
"dGaICHBFEFBIAedHcGCEhgBFIADHcEdfagBiaIbeHGCDfgDFciBEHAEAdHGCFIbbhgFdIaEcIFcbAEDGh",
"dGeihbaCFHFBCADgIECiaeFGBDHEDIgBHcfAbACFDiHEGGHFaEcibdaehBIFDGcFBGdcaEhIICDHgEfaB",
"dHcIFGABEIegCABFdHFbADHEIgCaGFebdCHIEDHaCIBFgciBHGFEadbaDGechiFhCIFDageBGfEBiHDca",
"dHGaicbeFEacFHBIDgIbFeDghcAHeIDcAFGBFdbHgECaIGcABFIDHeaIHcEFgbDBfDGAHEiCCGEIbdAFh",
"DICbAEhgfFaGIHDBCEbEHFCGADIEcBGDIFAhaDFCeHibggHiAFBdECIbehGAcFdcGadIFEhBhFDebcGia",
"diGbCEaHFAfCIdhEBghBeAGFCdiCEbDHGFIAIgdfEaBcHFaHcIBgedgcAhBdIFEEDiGfchabbHFEaidgc",
"diGEHFBCAHcaIBGEdfeFbCadIhgiGEDFAHBCaHFBcEDGICBDHGIfAegdcFEBAIHbehAIcGfDFaIGdhceb",
"eaBdfIHGcIGdCHbFAEfHCAGEDBigcebdHAIFhFAiECGdBBdifAGECHabFecdIHGDiHGBFCeaCEgHIabFD",
"EABFHiGcDHdICgaebfcGFBdeAHIaCDHIgBFEbFeaCDIGHiHGEFBdACfbaDECHIGgEHiBfcdadICGahFeB",
"eacIBFhdgGHBecDaFIDIfgAhCBECFGHDEiabIdHaGBECFabeCFIGHDfCiBHGdeAHgdFEabIcBEADiCFGh",
"EadCFbIhGbGCiahdeffhiGedcABGDbEiFHCACEadhgbFIIfHBcAeGddCfabegiHaBEHGIFDChIGFDcaBE",
]
export class LevelManager {
private static instance: LevelManager
public static getInstance(): LevelManager {
if (!LevelManager.instance) {
LevelManager.instance = new LevelManager()
}
return LevelManager.instance
}
private levelMap: Map<string, Array<string>> = new Map()
public init(): void {
this.levelMap.set(config.DIFFICULTY_TYPE.Easy, Easy)
this.levelMap.set(config.DIFFICULTY_TYPE.Medium, Medium)
this.levelMap.set(config.DIFFICULTY_TYPE.Hard, Hard)
this.levelMap.set(config.DIFFICULTY_TYPE.Expert, Expert)
this.levelMap.set(config.DIFFICULTY_TYPE.Extreme, Extreme)
//检查关卡配置
this.levelMap.forEach((list, key)=>{
for (var i=0; i<list.length; i++) {
if (list[i].length != 81) {
console.error("关卡配置有误>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", key, i)
}
}
})
}
public getLevelStr(difficulty: string, index: number): string {
var list = this.levelMap.get(difficulty)
if (list) {
return list[index]
}
return ""
}
}

View File

@@ -0,0 +1,3 @@
{
"uuid": "4b2967ad-786a-4ad1-8b1d-22b093d62575"
}

View File

@@ -1,6 +1,8 @@
import { config } from "../constants/config"
import { DataStage, createDataStage } from "../types/global"
import { DOStage } from "./DOStage"
import { DOUser } from "./DOUser"
export class StorageManager {
@@ -13,58 +15,96 @@ export class StorageManager {
return StorageManager.instance
}
private changed = false
private user: DOUser;
private stageID: string = "";
private stageMap: Map<string, DataStage> = new Map();
private stageChanged = false
private stageMap: Map<string, DOStage> = new Map();
public init(): void {
this.changed = false
if (!this.user) {
var jsonStr = Laya.LocalStorage.getItem("user")
if (jsonStr) {
this.user = new DOUser(JSON.parse(jsonStr))
}
else {
this.user = new DOUser({isCompletedMain: true, dones: new Array(), progresses: new Array()})
}
}
this.stageID = ""
this.stageChanged = false
}
public getUser(): DOUser {
return this.user
}
public saveUser(): void {
if (this.user) {
var jsonStr = JSON.stringify(this.user.getData())
Laya.LocalStorage.setItem("user", jsonStr)
}
}
public cleanStage(stageID: string): void {
if (this.stageMap.has(stageID)) {
this.stageMap.delete(stageID)
}
Laya.LocalStorage.removeItem(stageID)
this.stageID = ""
this.stageChanged = false
}
public newStage(stageID: string, type: number, name: string, difficulty: string, index: number): DOStage {
this.stageID = stageID
this.stageChanged = false
var dataStage: DataStage = createDataStage(stageID, type, name, difficulty, index)
var doStage: DOStage = new DOStage(dataStage)
this.stageMap.set(stageID, doStage)
return doStage
}
public loadStage(stageID: string): DOStage {
this.stageID = stageID
var dataStage: DataStage
this.stageChanged = false
if (this.stageMap.has(stageID)) {
dataStage = this.stageMap.get(stageID)
var doStage: DOStage = this.stageMap.get(stageID)
return doStage
}
else {
var jsonStr = Laya.LocalStorage.getItem(stageID)
if (jsonStr) {
dataStage = JSON.parse(jsonStr)
this.stageMap.set(stageID, dataStage)
}
else {
dataStage = createDataStage("first", "", config.DIFFICULTY_TYPE.Easy)
this.stageMap.set(stageID, dataStage)
var dataStage: DataStage = JSON.parse(jsonStr)
var doStage: DOStage = new DOStage(dataStage)
this.stageMap.set(stageID, doStage)
return doStage
}
}
var levelStr = "aBCeIGFhdEDFcAHBGIhigBdfecAgHDiFBCaeBEAGHCIdffcIdEAHbgcABfGEdiHIFHaCDGEBDGEHbiaFC"
return new DOStage(dataStage, levelStr)
return null
}
public cleanStage(): void {
if (this.stageID && this.stageID.length > 0) {
if (this.stageMap.has(this.stageID)) {
this.stageMap.delete(this.stageID)
}
Laya.LocalStorage.removeItem(this.stageID)
this.stageID = ""
}
}
public saveStage(): void {
if (this.changed) {
this.changed = false
if (this.stageChanged) {
this.stageChanged = false
if (this.stageMap.has(this.stageID)) {
var dataStage = this.stageMap.get(this.stageID)
var jsonStr = JSON.stringify(dataStage)
var doStage = this.stageMap.get(this.stageID)
var jsonStr = JSON.stringify(doStage.getData())
Laya.LocalStorage.setItem(this.stageID, jsonStr)
}
}
}
public onChanged(): void {
this.changed = true
this.stageChanged = true
}
public cleanAll(): void {
this.user = new DOUser({isCompletedMain: true, dones: new Array(), progresses: new Array()})
this.stageID = ""
this.stageChanged = false
this.stageMap.clear()
Laya.LocalStorage.clear()
}
}

View File

@@ -12,10 +12,10 @@ export class UIManager extends Laya.Script {
private static _instance: UIManager
onAwake(): void {
UIManager._instance = this
}
StorageManager.getInstance().init()
this.loadHome()
onStart(): void {
this.loadHomeUI()
}
public static getInstance(): UIManager {
@@ -24,51 +24,49 @@ export class UIManager extends Laya.Script {
private stage: Stage
public loadHome(): void {
public getUIRoot(): Laya.Node {
return this.owner
}
public loadHomeUI(): void {
Laya.loader.load(respath.home_ui_res).then((go)=>{
var prefab = go.create()
this.owner.addChild(prefab)
this.getUIRoot().addChild(prefab)
})
}
public loadStage(stageID: string, clean: boolean=false): void {
if (clean) {
StorageManager.getInstance().cleanStage()
}
public loadStageUI(stageID: string): void {
if (this.stage) {
this.stage.onLoadStage(StorageManager.getInstance().loadStage(stageID))
}
else {
Laya.loader.load(respath.stage_ui_res).then((go)=>{
var prefab = go.create()
this.stage = this.owner.addChild(prefab).getComponent(Stage)
this.stage = this.getUIRoot().addChild(prefab).getComponent(Stage)
this.stage.onLoadStage(StorageManager.getInstance().loadStage(stageID))
})
}
}
public closeStage(): void {
public closeStageUI(): void {
if (this.stage) {
this.stage.owner.destroy()
this.stage = null
}
}
public loadGameOver(): void {
public loadGameOverUI(): void {
Laya.loader.load(respath.gameover_ui_res).then((go)=>{
var prefab = go.create()
this.owner.addChild(prefab)
this.getUIRoot().addChild(prefab)
})
}
public loadGameDone(): void {
public loadGameDoneUI(): void {
Laya.loader.load(respath.gamedone_ui_res).then((go)=>{
var prefab = go.create()
this.owner.addChild(prefab)
this.getUIRoot().addChild(prefab)
})
}
onLateUpdate(): void {
StorageManager.getInstance().saveStage()
}
}

View File

@@ -18,8 +18,10 @@ export interface DataUndo {
//关卡数据
export interface DataStage {
id: string,
type: number,
name: string,
difficulty: number,
difficulty: string,
index: number,
mistake?: number,
duration?: number,
note_open?: boolean,
@@ -28,8 +30,8 @@ export interface DataStage {
blocks?: Array<DataBlock>,
undos?: Array<DataUndo>,
}
export function createDataStage(id: string, name: string, difficulty: number): DataStage {
var data: DataStage = {id: id, name: name, difficulty: difficulty}
export function createDataStage(id: string, type: number, name: string, difficulty: string, index: number): DataStage {
var data: DataStage = {id: id, type: type, name: name, difficulty: difficulty, index: index}
data.mistake = 0
data.duration = 0
data.note_open = false
@@ -38,4 +40,15 @@ export function createDataStage(id: string, name: string, difficulty: number): D
data.blocks = new Array()
data.undos = new Array()
return data
}
export interface DataProgress {
difficulty: string,
index: number,
}
export interface DataUser {
isCompletedMain: boolean,//当前主线是否已完成 默认true
dones: Array<string>,//已完成关卡
progresses: Array<DataProgress>,//已经完成的进度
}

15
src/utils/utility.ts Normal file
View File

@@ -0,0 +1,15 @@
export function Utility_ConvertSecondToString(second: number) {
var last = second
var hour = Math.floor(last/3600)
last = last - hour * 3600
var minite = Math.floor(last/60)
last = last - minite * 60
var second = Math.floor(last)
function format(value: number) {
return value>=10?value.toString():("0"+value)
}
return `${format(hour)}:${format(minite)}:${format(second)}`
}

View File

@@ -0,0 +1,3 @@
{
"uuid": "d17f1a58-98e1-4a84-8bd0-8612a1662cea"
}

13
src/views/CommonData.ts Normal file
View File

@@ -0,0 +1,13 @@
const { regClass, property } = Laya;
@regClass()
export class CommonData extends Laya.Script {
declare owner : Laya.Box;
@property(Number)
public intValue: number = 0;
@property(String)
public strValue: string = "";
}

View File

@@ -0,0 +1,3 @@
{
"uuid": "8857686b-9b2c-4e9c-af0f-0164c0994e46"
}

View File

@@ -1,3 +1,6 @@
import { config } from "../constants/config";
import { CommonData } from "./CommonData";
const { regClass, property } = Laya;
@regClass()
@@ -7,29 +10,45 @@ export class Difficulty extends Laya.Script {
@property(Laya.Box)
public obj_items: Laya.Box;
private items: Array<Laya.Box> = new Array()
//组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次
//onAwake(): void {}
onAwake(): void {
var offset = this.owner.getChildByName("offset") as Laya.Box
var bg = offset.getChildByName("bg") as Laya.Sprite
bg.graphics.clear()
bg.graphics.drawRoundRect(0, 0, offset.width, offset.height, 20, 20, 0, 0, "#f5f7fb")
//组件被启用后执行,例如节点被添加到舞台后
//onEnable(): void {}
Laya.Tween.to(offset, {y: 560}, 500)
//组件被禁用时执行,例如从节点从舞台移除后
//onDisable(): void {}
var mask = this.owner.getChildByName("mask")
mask.on(Laya.Event.CLICK, this, ()=>{
Laya.Tween.to(offset, {y: 3000}, 500, null, Laya.Handler.create(this, () => {
this.owner.destroy()
}))
})
}
//第一次执行update之前执行只会执行一次
//onStart(): void {}
//手动调用节点销毁时执行
//onDestroy(): void {}
//每帧更新时执行尽量不要在这里写大循环逻辑或者使用getComponent方法
//onUpdate(): void {}
//每帧更新时执行在update之后执行尽量不要在这里写大循环逻辑或者使用getComponent方法
//onLateUpdate(): void {}
//鼠标点击后执行。与交互相关的还有onMouseDown等十多个函数具体请参阅文档。
//onMouseClick(): void {}
public onInit(callback: any): void {
var list: Array<string> = new Array()
list.push(config.DIFFICULTY_TYPE.Easy)
list.push(config.DIFFICULTY_TYPE.Medium)
list.push(config.DIFFICULTY_TYPE.Hard)
list.push(config.DIFFICULTY_TYPE.Expert)
list.push(config.DIFFICULTY_TYPE.Extreme)
for (var i=0; i<list.length; i++) {
var obj = this.obj_items.getChildAt(i)
var Label = obj.getChildByName("Label") as Laya.Label
Label.text = list[i]
var data = obj.getComponent(CommonData)
data.strValue = list[i]
obj.on(Laya.Event.CLICK, this, (evt: Laya.Event)=>{
var data = evt.target.getComponent(CommonData)
if (callback) {
callback(data.strValue)
}
this.owner.destroy()
})
}
}
}

View File

@@ -1,4 +1,9 @@
import { respath } from "../constants/respath";
import { config } from "../constants/config";
import { UIManager } from "../models/UIManager";
import { StorageManager } from "../models/StorageManager";
import { LevelManager } from "../models/LevelManager";
import { Difficulty } from "./Difficulty";
const { regClass, property } = Laya;
@@ -16,13 +21,35 @@ export class GameOver extends Laya.Script {
//组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次
onAwake(): void {
this.btn_restart.on(Laya.Event.CLICK, this, (evt: Laya.Event) => {
UIManager.getInstance().loadStage("first", true);
this.owner.destroy()
var doStage = StorageManager.getInstance().loadStage(config.DEFAULT_STAGE_ID)
var difficulty = doStage.get_difficulty()
StorageManager.getInstance().cleanStage(config.DEFAULT_STAGE_ID)
var user = StorageManager.getInstance().getUser()
user.set_isCompletedMain(false)
StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty, user.get_progress(difficulty))
UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID);
this.owner.destroy()
})
this.btn_new.on(Laya.Event.CLICK, this, (evt: Laya.Event) => {
UIManager.getInstance().loadStage("first", true);
this.owner.destroy()
Laya.loader.load(respath.difficulty_ui_res).then((go)=>{
var prefab = go.create()
var d = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(Difficulty)
d.onInit((value: string)=> {
console.log("选择难度", value)
StorageManager.getInstance().cleanStage(config.DEFAULT_STAGE_ID)
var user = StorageManager.getInstance().getUser()
user.set_isCompletedMain(false)
var index = user.get_progress(value)
var levelStr = LevelManager.getInstance().getLevelStr(value, index)
if (!levelStr || levelStr.length <= 0) {//说明当前难度已经打通了,所以给他从头开始
user.update_progress(value, 0)
}
StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, value, value, user.get_progress(value))
UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID);
this.owner.destroy()
})
})
})
}

View File

@@ -1,6 +1,11 @@
import { UIManager } from "../models/UIManager";
import { StorageManager } from "../models/StorageManager";
import { respath } from "../constants/respath";
import { Difficulty } from "./Difficulty";
import { LevelManager } from "../models/LevelManager";
import { config } from "../constants/config";
import { Utility_ConvertSecondToString } from "../utils/utility";
const { regClass, property } = Laya
@@ -9,23 +14,71 @@ export class Home extends Laya.Script {
declare owner : Laya.Box;
@property(Laya.Box)
public btn_start: Laya.Box;
public btn_new_blue: Laya.Box;
@property(Laya.Box)
public btn_continue: Laya.Box;
@property(Laya.Box)
public btn_new_white: Laya.Box;
@property(Laya.Box)
public btn_clean: Laya.Box;
//组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次
onAwake(): void {
this.btn_start.on(Laya.Event.CLICK, this, (evt: Laya.Event) => {
console.log("btn_start=", evt);
UIManager.getInstance().loadStage("first");
this.btn_new_blue.on(Laya.Event.CLICK, this, this.onClickNew)
this.btn_new_white.on(Laya.Event.CLICK, this, this.onClickNew)
this.btn_continue.on(Laya.Event.CLICK, this, (evt: Laya.Event)=>{
UIManager.getInstance().closeStageUI()
UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID);
this.owner.destroy()
})
var user = StorageManager.getInstance().getUser()
this.btn_new_blue.visible = user.get_isCompletedMain()
this.btn_new_white.visible = user.get_isCompletedMain() == false
this.btn_continue.visible = user.get_isCompletedMain() == false
if (user.get_isCompletedMain() == false) {
var label_time = this.btn_continue.getChildByName("time").getChildByName("label_time") as Laya.Label
var doStage = StorageManager.getInstance().loadStage(config.DEFAULT_STAGE_ID)
var duration = doStage.get_duration()
var timeStr = Utility_ConvertSecondToString(duration)
label_time.text = `${timeStr} - ${doStage.get_difficulty()}`
}
//测试逻辑
this.btn_clean.on(Laya.Event.CLICK, this, (evt: Laya.Event) => {
console.log("btn_clean=", evt);
StorageManager.getInstance().cleanStage()
Laya.LocalStorage.clear()
StorageManager.getInstance().cleanAll()
user = StorageManager.getInstance().getUser()
this.btn_new_blue.visible = user.get_isCompletedMain()
this.btn_new_white.visible = user.get_isCompletedMain() == false
this.btn_continue.visible = user.get_isCompletedMain() == false
})
this.btn_clean.visible = config.DEBUG
//======
}
public onClickNew(evt: Laya.Event): void {
Laya.loader.load(respath.difficulty_ui_res).then((go)=>{
var prefab = go.create()
var d = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(Difficulty)
d.onInit((value: string)=> {
console.log("选择难度", value)
UIManager.getInstance().closeStageUI()
StorageManager.getInstance().cleanStage(config.DEFAULT_STAGE_ID)
var user = StorageManager.getInstance().getUser()
user.set_isCompletedMain(false)
var index = user.get_progress(value)
var levelStr = LevelManager.getInstance().getLevelStr(value, index)
if (!levelStr || levelStr.length <= 0) {//说明当前难度已经打通了,所以给他从头开始
user.update_progress(value, 0)
}
StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, value, value, user.get_progress(value))
UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID);
this.owner.destroy()
})
})
}

View File

@@ -4,6 +4,8 @@ import { Block } from "./Block";
import { Candy } from "./Candy";
import { DOStage } from "../models/DOStage";
import { config } from "../constants/config";
import { StorageManager } from "../models/StorageManager";
import { Utility_ConvertSecondToString } from "../utils/utility";
const { regClass, property } = Laya;
@@ -56,8 +58,8 @@ export class Stage extends Laya.Script {
//组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次
onAwake(): void {
this.btn_back.on(Laya.Event.CLICK, this, ()=>{
UIManager.getInstance().loadHome();
UIManager.getInstance().closeStage();
UIManager.getInstance().loadHomeUI();
UIManager.getInstance().closeStageUI();
})
for (var i=0; i<this.obj_blocks.numChildren; i++) {
var hbox = this.obj_blocks.getChildAt(i);
@@ -101,6 +103,7 @@ export class Stage extends Laya.Script {
this.data = doStage
this.onUpdateScore()
this.label_diff.text = this.data.get_difficulty()
this.onUpdateMistake()
var begin = Date.now()
Laya.timer.loop(1000, this, ()=>{
@@ -108,12 +111,7 @@ export class Stage extends Laya.Script {
this.data.set_duration(this.data.get_duration() + Math.floor((now-begin)/1000))
begin = now
var last = this.data.get_duration()
var hour = Math.floor(last/3600)
last = last - hour * 3600
var minite = Math.floor(last/60)
last = last - minite * 60
var second = Math.floor(last)
this.label_time.text = `${hour>=10?hour:("0"+hour)}:${minite>=10?minite:("0"+minite)}:${second>10?second:("0"+second)}`
this.label_time.text = Utility_ConvertSecondToString(last)
})
var blocks = doStage.get_blocks()
@@ -335,7 +333,16 @@ export class Stage extends Laya.Script {
if (b) {
if (this.getIsComplete()) {
console.log("完成关卡")
UIManager.getInstance().loadGameDone()
StorageManager.getInstance().cleanStage(this.data.get_stageID())//完成关卡清除关卡数据
var user = StorageManager.getInstance().getUser()
if (this.data.get_stageType() == config.STAGE_TYPE.MAIN) {
user.set_isCompletedMain(true)
user.update_progress(this.data.get_difficulty(), this.data.get_stageIndex()+1)
}
else if (this.data.get_stageType() == config.STAGE_TYPE.DC) {
user.add_done(this.data.get_stageID())
}
UIManager.getInstance().loadGameDoneUI()
}
}
else {//失败
@@ -343,7 +350,7 @@ export class Stage extends Laya.Script {
this.onUpdateMistake()
if (this.data.get_mistake() >= config.MISTAKE_MAX) {
console.log("关卡失败")
// UIManager.getInstance().loadGameOver()
UIManager.getInstance().loadGameOverUI()
}
}
}