完善关卡逻辑

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

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()
}
}
}