diff --git a/assets/resources/Home.lh b/assets/resources/Home.lh index 2e16cf7..81e6863 100644 --- a/assets/resources/Home.lh +++ b/assets/resources/Home.lh @@ -1,6 +1,6 @@ { "_$ver": 1, - "_$id": "gvlq012i", + "_$id": "dzyyfm4n", "_$type": "Box", "name": "Home", "width": 1080, @@ -15,13 +15,16 @@ "_$type": "f2970e4d-7a09-4a9b-aef3-45d330c86f4f", "scriptPath": "../src/views/Home.ts", "btn_start": { - "_$ref": "098pc00r" + "_$ref": "vfxym76v" + }, + "btn_clean": { + "_$ref": "ttvxhmrp" } } ], "_$child": [ { - "_$id": "0dr4l4hi", + "_$id": "x8wx2qo1", "_$type": "Image", "name": "Mask", "width": 1080, @@ -34,7 +37,26 @@ "color": "#ffffff" }, { - "_$id": "098pc00r", + "_$id": "pd4fx8i2", + "_$type": "Button", + "name": "btn_continue", + "x": 440, + "y": 737, + "width": 200, + "height": 100, + "_mouseState": 2, + "centerX": 0, + "centerY": -173, + "skin": "res://7eeb7e11-21ca-41ca-b7c2-dd2afa0c3ba7", + "label": "继续", + "labelFont": "res://55f943ef-58d2-4b30-8498-271c4213cce4", + "labelSize": 60, + "labelColors": "#ffffff,#32cc6b,#ff0000", + "labelAlign": "center", + "labelVAlign": "middle" + }, + { + "_$id": "vfxym76v", "_$type": "Button", "name": "btn_start", "x": 440, @@ -54,23 +76,24 @@ "labelStrokeColor": "rgba(216, 208, 208, 1)" }, { - "_$id": "xi28zcch", + "_$id": "ttvxhmrp", "_$type": "Button", - "name": "btn_continue", + "name": "btn_clean", "x": 440, - "y": 737, + "y": 1820, "width": 200, "height": 100, "_mouseState": 2, + "bottom": 0, "centerX": 0, - "centerY": -173, "skin": "res://7eeb7e11-21ca-41ca-b7c2-dd2afa0c3ba7", - "label": "继续", + "label": "清理", "labelFont": "res://55f943ef-58d2-4b30-8498-271c4213cce4", "labelSize": 60, "labelColors": "#ffffff,#32cc6b,#ff0000", "labelAlign": "center", - "labelVAlign": "middle" + "labelVAlign": "middle", + "labelStrokeColor": "rgba(216, 208, 208, 1)" } ] } \ No newline at end of file diff --git a/assets/resources/Home.lh.meta b/assets/resources/Home.lh.meta index 8d3d713..a94fd07 100644 --- a/assets/resources/Home.lh.meta +++ b/assets/resources/Home.lh.meta @@ -1,3 +1,3 @@ { - "uuid": "9d706cf1-ff30-4183-b441-c24d9b329c53" + "uuid": "ed2f6a24-7574-4f6a-b76b-816fe2521be2" } \ No newline at end of file diff --git a/assets/resources/Stage.lh b/assets/resources/Stage.lh index 79109f3..9036610 100644 --- a/assets/resources/Stage.lh +++ b/assets/resources/Stage.lh @@ -14,6 +14,9 @@ { "_$type": "692a672b-2457-456c-8093-321ea7a10e1b", "scriptPath": "../src/views/Stage.ts", + "btn_back": { + "_$ref": "l1ebdt6a" + }, "label_stage_name": { "_$ref": "w8r3l8ie" }, @@ -123,6 +126,7 @@ "x": 116, "width": 200, "height": 64, + "visible": false, "text": "[color=#000000]关卡 [/color][color=#1d5cdc]20[/color]", "font": "res://55f943ef-58d2-4b30-8498-271c4213cce4", "fontSize": 60, @@ -208,7 +212,7 @@ "height": 60, "centerX": 369, "centerY": -550, - "text": "99:99:99", + "text": "00:00:00", "font": "res://55f943ef-58d2-4b30-8498-271c4213cce4", "fontSize": 30, "color": "rgba(123, 129, 140, 1)", diff --git a/src/constants/config.ts b/src/constants/config.ts index f7747a5..230ecd9 100644 --- a/src/constants/config.ts +++ b/src/constants/config.ts @@ -1,9 +1,18 @@ export const config = { - debug: false, - openGuide: true, - breakpoint: 1, // 竖版和横版的分界宽度 + DEBUG: false, + OPEN_GUIDE: true, + BREAK_POINT: 1, // 竖版和横版的分界宽度 + + DIFFICULTY_TYPE: {//难度 + Easy: 1, + Medium: 2, + Hard: 3, + Expert: 4, + Extreme: 5, + }, + } diff --git a/src/models/StorageManager.ts b/src/models/StorageManager.ts new file mode 100644 index 0000000..8718037 --- /dev/null +++ b/src/models/StorageManager.ts @@ -0,0 +1,79 @@ +import { config } from "../constants/config" +import { DOStage } from "../types/DOStage" + + +export class StorageManager { + + private static instance: StorageManager + public static getInstance(): StorageManager { + if (!StorageManager.instance) { + StorageManager.instance = new StorageManager() + } + return StorageManager.instance + } + + + public static createDataBlock(index: number, show: number, score: number=0, notes: Array=new Array()): any {//格子 + var dataBlock = { + index: index, + show: show, + score: score, + notes: notes, + } + return dataBlock + } + + public static createDataCandy(left: number): any {//可选数字 + var dataCandy = { + left: left, + } + return dataCandy + } + + public static createDataStage(mistake: number, difficulty: number, duration: number=0, blocks: Array=new Array(), candys: Array=new Array()): any {//关卡数据 + var dataStage = { + mistake: mistake, + difficulty: difficulty, + duration: duration, + note_open: false, + blocks: blocks, + candys: candys, + } + return dataStage + } + + + private stageID: string = ""; + private stageMap: Map = new Map(); + + public init(): void { + } + + public loadStage(stageID: string): DOStage { + this.stageID = stageID + var dataStage + if (this.stageMap.has(stageID)) { + dataStage = this.stageMap.get(stageID) + } + else { + var jsonStr = Laya.LocalStorage.getItem(stageID) + if (jsonStr) { + dataStage = JSON.parse(jsonStr) + this.stageMap.set(stageID, dataStage) + } + else { + dataStage = StorageManager.createDataStage(0, config.DIFFICULTY_TYPE.Easy) + this.stageMap.set(stageID, dataStage) + } + } + return new DOStage(dataStage) + } + + public saveStage(): void { + if (this.stageMap.has(this.stageID)) { + var dataStage = this.stageMap.get(this.stageID) + var jsonStr = JSON.stringify(dataStage) + Laya.LocalStorage.setItem(this.stageID, jsonStr) + } + } +} \ No newline at end of file diff --git a/src/models/StorageManager.ts.meta b/src/models/StorageManager.ts.meta new file mode 100644 index 0000000..8dcb558 --- /dev/null +++ b/src/models/StorageManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "7503e6c9-bbbe-40ca-813c-660b4927d3a6" +} \ No newline at end of file diff --git a/src/models/UIManager.ts b/src/models/UIManager.ts index 686cac9..5ccbe2f 100644 --- a/src/models/UIManager.ts +++ b/src/models/UIManager.ts @@ -1,7 +1,8 @@ import { respath } from "../constants/respath" -import { Home } from "../views/Home" +import { StorageManager } from "./StorageManager" import { Stage } from "../views/Stage" + const { regClass, property } = Laya @regClass() @@ -11,6 +12,9 @@ export class UIManager extends Laya.Script { private static _instance: UIManager onAwake(): void { UIManager._instance = this + + StorageManager.getInstance().init() + this.loadHome() } @@ -29,7 +33,7 @@ export class UIManager extends Laya.Script { Laya.loader.load(respath.stage_ui_res).then((go)=>{ var prefab = go.create() var stage = this.owner.addChild(prefab).getComponent(Stage) - stage.onLoadStage("aBCeIGFhdEDFcAHBGIhigBdfecAgHDiFBCaeBEAGHCIdffcIdEAHbgcABfGEdiHIFHaCDGEBDGEHbiaFC"); + stage.onLoadStage(StorageManager.getInstance().loadStage("first")) }) } diff --git a/src/types/Block.ts b/src/types/Block.ts index db9bccb..84992a9 100644 --- a/src/types/Block.ts +++ b/src/types/Block.ts @@ -1,4 +1,5 @@ import { G_ShowScoreTips } from "../views/GUITips"; +import { DOBlock } from "./DOBlock"; const { regClass, property } = Laya; @@ -15,18 +16,14 @@ export class Block extends Laya.Script { @property(Number) public YGroup: number = 0; - private selected: boolean = false - private newSelect: boolean = false - private preset: boolean = false//预设格子 - private checked: boolean = false//正确格子 - private showNumber: number = 0; - private correctNumber: number = 0; - private score: number = 0 - private note_numbers: Array = new Array() - private label_show: Laya.Label; private tips_labels: Array = new Array(); private animator: Laya.Animator2D + + private selected: boolean = false + private newSelect: boolean = false + + private data: DOBlock public onInit(XIndex: number, YIndex: number, XGroup: number, YGroup: number, label_obj: Laya.Box, handler: any, func: any): void { this.XIndex = XIndex; @@ -68,69 +65,43 @@ export class Block extends Laya.Script { } } - public setBlock(preset: boolean, showNumber: number, correctNumber: number): void { - this.preset = preset; - this.checked = preset; - this.showNumber = showNumber; - this.correctNumber = correctNumber; - this.score = 0 + public setBlock(data: DOBlock): void { + this.data = data; this.updateBlock(); } - - public getIsPreset(): boolean { - return this.preset; - } - - public getIsChecked(): boolean { - return this.checked; - } - - public getShowNumber(): number { - return this.showNumber; + public getData(): DOBlock { + return this.data } public setShowNumber(showNumber: number): boolean { - if (this.checked == false) { - if (showNumber == this.correctNumber) - this.checked = true; - this.showNumber = showNumber; - if (this.checked || showNumber == 0) {//正确或者擦除 - this.note_numbers = new Array() - } - this.score = 0 + if (this.data.get_checked() == false) { + this.data.set_show(showNumber) + var score: number = 0 if (this.newSelect) { this.newSelect = false - if (this.checked) { - this.score = 150 - G_ShowScoreTips(this.score.toString(), this.owner) + if (this.data.get_checked()) { + score = 150 + this.data.set_score(score) + G_ShowScoreTips(score.toString(), this.owner) } } - this.updateBlock(); + this.updateBlock() } - return this.checked - } - - public getCorrectNumber(): number { - return this.correctNumber; - } - - public getScore(): number { - return this.score + return this.data.get_checked() } public addNoteNumber(noteNumber: number): void { - if (this.note_numbers.indexOf(noteNumber) < 0) { - this.note_numbers.push(noteNumber) - this.updateBlock(); + if (this.data.add_note(noteNumber)) { + this.updateBlock() } } updateBlock(): void { for (var i=0; i 0) { - this.label_show.text = this.showNumber.toString(); - if (this.checked) { + if (this.data.get_show() > 0) { + this.label_show.text = this.data.get_show().toString() + if (this.data.get_checked()) { this.label_show.color = "#000000" } else { @@ -139,8 +110,9 @@ export class Block extends Laya.Script { } else { this.label_show.text = ""; - for (var i=0; i 0 - if (this.showNumber > 0) { - this.label_show.text = this.showNumber.toString(); + this.owner.active = this.getLeft() > 0 + if (this.data.get_show() > 0) { + this.label_show.text = this.data.get_show().toString() } else { this.label_show.text = "" } - if (this.left > 0) { - this.label_left.text = this.left.toString(); + if (this.getLeft() > 0) { + this.label_left.text = this.getLeft().toString(); } else { this.label_left.text = "" diff --git a/src/types/DOBlock.ts b/src/types/DOBlock.ts new file mode 100644 index 0000000..0fd2a1c --- /dev/null +++ b/src/types/DOBlock.ts @@ -0,0 +1,80 @@ + + +import { StorageManager } from "../models/StorageManager" + + +export class DOBlock { + + private data: any + private preset: boolean = false//预设格子 + private correct: number = 0; + private checked: boolean = false//是否正确 + + + constructor(dataBlock: any, preset: boolean, correct: number) { + this.data = dataBlock + this.preset = preset + this.correct = correct + this.checked = preset || (dataBlock.show == correct) + } + + //====================================持久化数据 + public get_index(): number { + return this.data.index + } + + public get_show(): number { + return this.data.show + } + public set_show(show: number): void { + this.data.show = show + if (show == this.get_correct()) + this.checked = true + if (this.get_checked() || show == 0) + this.clean_notes()//正确或者擦除 + StorageManager.getInstance().saveStage() + } + + public get_score(): number { + return this.data.score + } + public set_score(score: number): void { + this.data.score = score + StorageManager.getInstance().saveStage() + } + + public get_notes(): Array { + return this.data.notes + } + public add_note(noteNumber: number): boolean { + var b = false + if (this.data.notes.indexOf(noteNumber) < 0) { + this.data.notes.push(noteNumber) + StorageManager.getInstance().saveStage() + b = true + } + return b + } + public clean_notes(): void { + if (this.data.notes.length > 0) { + this.data.notes = new Array() + StorageManager.getInstance().saveStage() + } + } + //====================================持久化数据 + + public get_preset(): boolean { + return this.preset + } + + public get_correct(): number { + return this.correct + } + + public get_checked(): boolean { + return this.checked + } + + + +} \ No newline at end of file diff --git a/src/types/DOBlock.ts.meta b/src/types/DOBlock.ts.meta new file mode 100644 index 0000000..3bc8ee1 --- /dev/null +++ b/src/types/DOBlock.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "aeb99474-1a9f-4a01-ac79-3416ec39a309" +} \ No newline at end of file diff --git a/src/types/DOCandy.ts b/src/types/DOCandy.ts new file mode 100644 index 0000000..7d5bfee --- /dev/null +++ b/src/types/DOCandy.ts @@ -0,0 +1,33 @@ + + +import { StorageManager } from "../models/StorageManager" + + +export class DOCandy { + + private data: any + private show: number + + constructor(dataCandy: any, show: number) { + this.data = dataCandy + this.show = show + } + + //====================================持久化数据 + public get_left(): number { + return this.data.left + } + public set_left(left: number): void { + this.data.left = left + StorageManager.getInstance().saveStage() + } + //====================================持久化数据 + + public get_show(): number { + return this.show + } + + + + +} \ No newline at end of file diff --git a/src/types/DOCandy.ts.meta b/src/types/DOCandy.ts.meta new file mode 100644 index 0000000..aa627ae --- /dev/null +++ b/src/types/DOCandy.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "0c3f05a2-7935-4847-8760-858002151854" +} \ No newline at end of file diff --git a/src/types/DOStage.ts b/src/types/DOStage.ts new file mode 100644 index 0000000..ffc8d79 --- /dev/null +++ b/src/types/DOStage.ts @@ -0,0 +1,139 @@ + + +import { StorageManager } from "../models/StorageManager" +import { DOBlock } from "./DOBlock" +import { DOCandy } from "./DOCandy" + + +export class DOStage { + + private data: any + private blocks: Array = new Array() + private candys: Array = new Array() + + private letterToNumber: any; + private numberToLetter: any; + + constructor(dataStage: any) { + this.data = dataStage + + this.letterToNumber = new Map(); + this.letterToNumber.set("A", 1); + this.letterToNumber.set("B", 2); + this.letterToNumber.set("C", 3); + this.letterToNumber.set("D", 4); + this.letterToNumber.set("E", 5); + this.letterToNumber.set("F", 6); + this.letterToNumber.set("G", 7); + this.letterToNumber.set("H", 8); + this.letterToNumber.set("I", 9); + + this.numberToLetter = new Map(); + this.numberToLetter.set(1, "a"); + this.numberToLetter.set(2, "b"); + this.numberToLetter.set(3, "c"); + this.numberToLetter.set(4, "d"); + this.numberToLetter.set(5, "e"); + this.numberToLetter.set(6, "f"); + this.numberToLetter.set(7, "g"); + this.numberToLetter.set(8, "h"); + this.numberToLetter.set(9, "i"); + + var blockMap: Map = new Map() + for (var i=0; i { + return this.blocks + } + + public get_candys(): Array { + return this.candys + } +} \ No newline at end of file diff --git a/src/types/DOStage.ts.meta b/src/types/DOStage.ts.meta new file mode 100644 index 0000000..e670c79 --- /dev/null +++ b/src/types/DOStage.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "d88044d6-69d3-44d1-85bf-2d353609a8d2" +} \ No newline at end of file diff --git a/src/views/Home.ts b/src/views/Home.ts index 5427ffb..a5b33c8 100644 --- a/src/views/Home.ts +++ b/src/views/Home.ts @@ -9,36 +9,22 @@ export class Home extends Laya.Script { @property(Laya.Button) public btn_start: Laya.Button; + @property(Laya.Button) + public btn_clean: Laya.Button; + //组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次 onAwake(): void { this.btn_start.on(Laya.Event.CLICK, this, (evt: Laya.Event) => { console.log("btn_start=", evt); - this.owner.visible = false; UIManager.getInstance().loadStage(); this.owner.destroy() }) + + this.btn_clean.on(Laya.Event.CLICK, this, (evt: Laya.Event) => { + console.log("btn_clean=", evt); + Laya.LocalStorage.clear() + }) } - //组件被启用后执行,例如节点被添加到舞台后 - //onEnable(): void {} - - //组件被禁用时执行,例如从节点从舞台移除后 - //onDisable(): void {} - - //第一次执行update之前执行,只会执行一次 - // onStart(): void {} - - //手动调用节点销毁时执行 - //onDestroy(): void {} - - //每帧更新时执行,尽量不要在这里写大循环逻辑或者使用getComponent方法 - //onUpdate(): void {} - - //每帧更新时执行,在update之后执行,尽量不要在这里写大循环逻辑或者使用getComponent方法 - //onLateUpdate(): void {} - - //鼠标点击后执行。与交互相关的还有onMouseDown等十多个函数,具体请参阅文档。 - //onMouseClick(): void {} - } diff --git a/src/views/Stage.ts b/src/views/Stage.ts index 3c14816..f177a48 100644 --- a/src/views/Stage.ts +++ b/src/views/Stage.ts @@ -1,6 +1,8 @@ +import { UIManager } from "../models/UIManager"; import { Block } from "../types/Block"; import { Candy } from "../types/Candy"; +import { DOStage } from "../types/DOStage"; const { regClass, property } = Laya; @@ -8,22 +10,17 @@ const { regClass, property } = Laya; export class Stage extends Laya.Script { declare owner : Laya.Box; - private letterToNumber: any; - private numberToLetter: any; - - @property(Laya.Text) - public label_stage_name: Laya.Text; + @property(Laya.Button) + public btn_back: Laya.Button @property(Laya.Label) public label_score: Laya.Label; @property(Laya.Label) public label_mistake: Laya.Label; - private mistake_now = 0 private mistake_all = 3 @property(Laya.Label) public label_diff: Laya.Label; @property(Laya.Label) public label_time: Laya.Label; - private stage_last: number @property(Laya.Box) public obj_blocks: Laya.Box; @@ -43,12 +40,13 @@ export class Stage extends Laya.Script { public btn_erase: Laya.Box; @property(Laya.Box) public btn_note: Laya.Box; + private btn_note_normal: Laya.Box + private btn_note_checked: Laya.Box @property(Laya.Box) public btn_hint: Laya.Box; - private is_note_open: boolean = false - private btn_note_normal: Laya.Box - private btn_note_checked: Laya.Box + private selectedBlock: Block; + private data: DOStage; @property(Laya.Box) public obj_block_colors: Laya.Box; @@ -65,33 +63,12 @@ export class Stage extends Laya.Script { @property(Laya.Image) public img_block_weak_wrong: Laya.Image; - private selectedBlock: Block; - - //组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次 onAwake(): void { - this.letterToNumber = new Map(); - this.letterToNumber.set("A", 1); - this.letterToNumber.set("B", 2); - this.letterToNumber.set("C", 3); - this.letterToNumber.set("D", 4); - this.letterToNumber.set("E", 5); - this.letterToNumber.set("F", 6); - this.letterToNumber.set("G", 7); - this.letterToNumber.set("H", 8); - this.letterToNumber.set("I", 9); - - this.numberToLetter = new Map(); - this.numberToLetter.set(1, "a"); - this.numberToLetter.set(2, "b"); - this.numberToLetter.set(3, "c"); - this.numberToLetter.set(4, "d"); - this.numberToLetter.set(5, "e"); - this.numberToLetter.set(6, "f"); - this.numberToLetter.set(7, "g"); - this.numberToLetter.set(8, "h"); - this.numberToLetter.set(9, "i"); - + this.btn_back.on(Laya.Event.CLICK, this, ()=>{ + UIManager.getInstance().loadHome(); + this.owner.destroy() + }) for (var i=0; i{ var now = Date.now() - this.stage_last += Math.floor((now-begin)/1000) + this.data.set_duration(this.data.get_duration() + Math.floor((now-begin)/1000)) begin = now - var last = this.stage_last + var last = this.data.get_duration() var hour = Math.floor(last/3600) last = last - hour * 3600 var minite = Math.floor(last/60) @@ -187,18 +126,34 @@ export class Stage extends Laya.Script { var second = Math.floor(last) this.label_time.text = `${hour>=10?hour:("0"+hour)}:${minite>=10?minite:("0"+minite)}:${second>10?second:("0"+second)}` }) + + var blocks = doStage.get_blocks() + for (var i=0; i = new Array() for (var i=0; i 0) { @@ -274,7 +231,7 @@ export class Stage extends Laya.Script { if (index >= list.length) index = list.length -1 var block = list[index] - block.setShowNumber(block.getCorrectNumber()) + block.setShowNumber(block.getData().get_correct()) this.onUpdateScore() this.onSetBlock(block) this.selectedBlock = block @@ -282,13 +239,13 @@ export class Stage extends Laya.Script { } public onApplyCandy(candy: Candy): void { - if (this.selectedBlock && this.selectedBlock.getIsChecked() == false) { - var showNumber = candy.getShowNumber() - if (this.is_note_open) { + if (this.selectedBlock && this.selectedBlock.getData().get_checked() == false) { + var showNumber = candy.getData().get_show() + if (this.data.get_note_open()) { var relateds = this.findRelatedBlocks(this.selectedBlock) var find = false for (var i=0; i= this.mistake_all) { + if (this.data.get_mistake() >= this.mistake_all) { //关卡失败 } } @@ -358,7 +315,7 @@ export class Stage extends Laya.Script { var list: Array = new Array() for (var i=0; i