// Learn TypeScript: // - https://docs.cocos.com/creator/manual/en/scripting/typescript.html // Learn Attribute: // - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html // Learn life-cycle callbacks: // - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html import MapConroler from "./Map"; import NumberToImage from "./NumberToImage"; import { MiniGameSdk } from "./Sdk/MiniGameSdk"; const { ccclass, property } = cc._decorator; @ccclass export default class SceneManager extends cc.Component { // 缓存 shop 预制体 private static cachedShopPrefab: cc.Prefab | null = null; // 缓存 shop 节点 private shopNode: cc.Node | null = null; // 缓存 reward 预制体 private static cachedRewardPrefab: cc.Prefab | null = null; // 缓存 reward 奖励窗口 节点 private RewardNode: cc.Node | null = null; //缓存月卡 private static cachedMonthlyCardPrefab: cc.Prefab | null = null; // 缓存月卡节点 private monthlyCardNode: cc.Node | null = null; @property(cc.Label) label: cc.Label = null; @property text: string = 'hello'; @property(cc.Node) freeze: cc.Node = null; @property(cc.Node) hammer: cc.Node = null; @property(cc.Node) magic_wand: cc.Node = null; @property(cc.Node) pause: cc.Node = null; @property(cc.Node) level: cc.Node = null; //time 弹窗的金币数 @property(cc.Node) timeCoin: cc.Node = null; //赢了win金币数 @property(cc.Node) winCoin: cc.Node = null; @property({ type: [cc.Prefab], tooltip: "方块数组" }) Block_Array: Array = []; @property({ type: [cc.Prefab], tooltip: "墙壁数组" }) Wall_Prefab: Array = []; particleEffects: cc.ParticleAsset[]; // @property({type: [cc.ParticleSystem], tooltip:"粒子数组"}) // particleEffects : Array = []; load1: boolean = false; load2: boolean = false; load3: boolean = false; btnName: string = ''; callBack: any; // LIFE-CYCLE CALLBACKS: onLoad() { cc.game.setFrameRate(63); this.changeBg(); // 预加载 shop 预制体 if (!SceneManager.cachedShopPrefab) { cc.assetManager.loadBundle('shop', (err: Error, bundle: cc.AssetManager.Bundle) => { if (err) { cc.error(err.message || err); return; } bundle.load('prefab/shop', cc.Prefab, (err: Error, prefab: cc.Prefab) => { if (err) { cc.error(err.message || err); return; } SceneManager.cachedShopPrefab = prefab; }); bundle.load('prefab/RewardWindow', cc.Prefab, (err: Error, prefab: cc.Prefab) => { if (err) { cc.error(err.message || err); return; } SceneManager.cachedRewardPrefab = prefab; }); bundle.load('prefab/monthlyCard', cc.Prefab, (err: Error, prefab: cc.Prefab) => { if (err) { cc.error(err.message || err); return; } SceneManager.cachedMonthlyCardPrefab = prefab; }); }); } setTimeout(() => { cc.director.preloadScene("HomeScene", (err) => { if (err) { // console.error('预加载 HomeScene 场景失败:', err); return; } // console.log('成功预加载 HomeScene 场景'); }); }, 1000); } //更新关卡获得金币 updateWinCoin() { console.log("更新关卡获得金币"); let winCoin = 40; winCoin = winCoin * cc.fx.GameConfig.GM_INFO.doubleCoin; if (winCoin > 0) { NumberToImage.numberToImageNodes(winCoin, 50, 8, "time_", this.winCoin, false); } else { this.winCoin.active = false; } } changeBg() { let number = Math.floor(Math.random() * 8) + 1; const path = 'bg/bg' + number; cc.resources.load(path, cc.SpriteFrame, (err, spriteFrame: cc.SpriteFrame) => { if (err) { console.error('动态加载背景图失败:', err); return; } this.node.getChildByName("Game").getChildByName("bg").getComponent(cc.Sprite).spriteFrame = spriteFrame; }) NumberToImage.numberToImageNodes((cc.fx.GameConfig.GM_INFO.level + 1), 43, 15, "level_", this.level, true); //time金币数量 NumberToImage.numberToImageNodes(1000, 25, 15, "button_", this.timeCoin, false); } loadParticleEffects() { const path = 'Particle'; cc.resources.loadDir(path, cc.ParticleAsset, (err, assets: cc.ParticleAsset[]) => { if (err) { console.error('动态加载粒子特效失败:', err); return; } this.particleEffects = assets; this.setParticleSort(); this.load3 = true; //console.log('粒子特效加载成功,共加载了', this.particleEffects.length, '个粒子特效'); }); } setWallPrefabSort() { const order = ['down', 'downLeft', 'downRight', 'left', 'right', 'up', 'upLeft', 'upRight']; this.Wall_Prefab.sort((a, b) => { const indexA = order.indexOf(a.name); const indexB = order.indexOf(b.name); if (indexA === -1) return 1; if (indexB === -1) return -1; return indexA - indexB; }); } setParticleSort() { const order = ['top', 'bot', 'rig', 'lef']; this.particleEffects.sort((a, b) => { // console.log(a.name.substr(0,3),b.name.substr(0,3)); const indexA = order.indexOf(a.name.substr(0, 3)); const indexB = order.indexOf(b.name.substr(0, 3)); if (indexA === -1) return 1; if (indexB === -1) return -1; return indexA - indexB; }); } setSort() { this.Block_Array.sort((a, b) => { // 从名称中提取数字部分 const numberA = parseInt(a.name.match(/\d+/)?.[0] || '0', 10); const numberB = parseInt(b.name.match(/\d+/)?.[0] || '0', 10); return numberA - numberB; }); } start() { } startGame() { cc.director.loadScene("HomeScene", (err) => { if (err) { console.error('加载 HomeScene 场景失败:', err); } else { // console.log('成功切换到 HomeScene 场景'); cc.director.loadScene("HomeScene"); } }); } returnHome() { if (this.node.getChildByName("Pause").getChildByName("btn").getComponent("btnControl")._touch) { this.closePause(); if (MapConroler._instance.gameStart == true) { // MiniGameSdk.API.showToast("体力值减少"); if (MapConroler._instance.count_Time) { let overTime = Date.now(); let count_Time = overTime - MapConroler._instance.count_Time; let add_Time = MapConroler._instance.add_Time; let data = { time: count_Time, add_Time: add_Time, result: "give_up" } cc.fx.GameTool.shushu_Track("finish_stage", data); } } this.node.getChildByName("Pause").getChildByName("btn").getComponent("btnControl").setTouch(false); cc.fx.AudioManager._instance.playEffect("zhuan1", null); this.node.getChildByName("zhuanchang").active = true; this.node.getChildByName("zhuanchang").getComponent(sp.Skeleton).setAnimation(1, "up", false); cc.director.preloadScene("HomeScene", (err, asset) => { if (err) { console.error('动态加载 Prefab 失败:', err); return; } }); setTimeout(() => { cc.director.loadScene("HomeScene"); }, 1200); } } destroyNodesInFrames(nodes: cc.Node[], callback: () => void) { const BATCH_SIZE = 10; // 每帧销毁的节点数量 let index = 0; const destroyBatch = () => { let count = 0; while (index < nodes.length && count < BATCH_SIZE) { const node = nodes[index]; if (node) { node.active = false; } index++; count++; } if (index < nodes.length) { this.scheduleOnce(destroyBatch, 6); } else { callback(); } }; destroyBatch(); } // 改进后的切换场景方法 switchToEmptyScene() { const allNodes = cc.director.getScene().children; this.destroyNodesInFrames(allNodes, () => { cc.director.loadScene("HomeScene"); }); } openPause() { cc.fx.AudioManager._instance.playEffect("anniu_little", null); if (this.pause.getComponent("btnControl")._touch) { this.pause.getComponent("btnControl").setTouch(false); this.node.getChildByName("Pause").active = true; MapConroler._instance.pause = true; MapConroler._instance.stopBoom(); } } closeShop() { if (this.shopNode) { this.shopNode.active = false; MapConroler._instance.pause = false; } } closePause() { cc.fx.AudioManager._instance.playEffect("anniu_little", null); this.pause.getComponent("btnControl").setTouch(true); this.node.getChildByName("Pause").active = false; if (MapConroler._instance.node.parent.getChildByName("Ice").active == false) { MapConroler._instance.pause = false; MapConroler._instance.startBoom(); } } openPropBuy(name) { MapConroler._instance.pause = true; MapConroler._instance.stopBoom(); this.btnName = name; let propWindow = this.node.getChildByName("Game").getChildByName("propWindow"); propWindow.active = true; propWindow.getChildByName("freeze").active = false; propWindow.getChildByName("hammer").active = false; propWindow.getChildByName("magic").active = false; propWindow.getChildByName("buy_Btn").getComponent("btnControl").setTouch(true); propWindow.getChildByName(name).active = true; // if(name == "hammer"){ // propWindow.getChildByName("buy_Btn").getChildByName("hammer").active = true; // propWindow.getChildByName("buy_Btn").getChildByName("nomal").active = false; // } // else{ // propWindow.getChildByName("buy_Btn").getChildByName("hammer").active = false; // propWindow.getChildByName("buy_Btn").getChildByName("nomal").active = true; // } } clickBtn() { cc.fx.AudioManager._instance.playEffect("anniu_Big", null); let propWindow = this.node.getChildByName("Game").getChildByName("propWindow"); if (propWindow.getChildByName("buy_Btn").getComponent("btnControl")._touch) { propWindow.getChildByName("buy_Btn").getComponent("btnControl").setTouch(false); if (this.btnName == "freeze") MapConroler._instance.buyFreeze(); else if (this.btnName == "hammer") MapConroler._instance.buyHammer(); else if (this.btnName == "magic") MapConroler._instance.buyMagic(); } } resetBtn() { let propWindow = this.node.getChildByName("Game").getChildByName("propWindow"); propWindow.getChildByName("buy_Btn").getComponent("btnControl").setTouch(true); } //打开商店 openShop() { if (!SceneManager.cachedShopPrefab) { cc.error('Shop prefab is not loaded yet.'); return; } MapConroler._instance.pause = true; if (!this.shopNode) { // 第一次使用,创建节点 this.shopNode = cc.instantiate(SceneManager.cachedShopPrefab); this.node.addChild(this.shopNode); this.shopNode.getComponent("shop").init(); } else { // 非第一次使用,直接激活节点 this.shopNode.active = true; this.shopNode.getComponent("shop").init(); } // console.log("shopNode parent:", this.shopNode.parent); } //打开月卡 openMonthlyCard() { if (!SceneManager.cachedMonthlyCardPrefab) { cc.error('MonthlyCard prefab is not loaded yet.'); return; } if (!this.monthlyCardNode) { // 第一次使用,创建节点 this.monthlyCardNode = cc.instantiate(SceneManager.cachedMonthlyCardPrefab); this.node.addChild(this.monthlyCardNode); this.monthlyCardNode.getComponent("monthlyCard").init(); this.monthlyCardNode.getComponent("monthlyCard").juwai = false; } else { // 非第一次使用,直接激活节点 this.monthlyCardNode.active = true; this.monthlyCardNode.getComponent("monthlyCard").init(); this.monthlyCardNode.getComponent("monthlyCard").juwai = false; } } updateCoin() { MapConroler._instance.updateCoin(); } closePropBuy() { MapConroler._instance.pause = false; MapConroler._instance.startBoom(); let freezeBtn = MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("timeBtn"); let hammerBtn = MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("destroyBtn"); let magicBtn = MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("magicBtn"); if (this.btnName == "freeze") freezeBtn.getComponent("btnControl").setTouch(true); else if (this.btnName == "hammer") hammerBtn.getComponent("btnControl").setTouch(true); else if (this.btnName == "magic") magicBtn.getComponent("btnControl").setTouch(true); this.node.getChildByName("Game").getChildByName("propWindow").active = false; } openRewardWindow(data) { console.log("_____________________打開獎勵弹窗"); if (!SceneManager.cachedRewardPrefab) { cc.error('Reward prefab is not loaded yet.'); return; } if (!this.RewardNode) { // 第一次使用,创建节点 this.RewardNode = cc.instantiate(SceneManager.cachedRewardPrefab); this.node.addChild(this.RewardNode); this.RewardNode.zIndex = 99; this.RewardNode.getComponent("Reward").init(data); } else { this.RewardNode.destroy(); this.RewardNode = null; this.RewardNode = cc.instantiate(SceneManager.cachedRewardPrefab); this.node.addChild(this.RewardNode); this.RewardNode.zIndex = 99; this.RewardNode.getComponent("Reward").init(data); } this.RewardNode.zIndex = 1001; } update(dt) { } }