// 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 { MiniGameManager } from "./Sdk/MiniGameManager"; import { MiniGameSdk } from "./Sdk/MiniGameSdk"; const {ccclass, property} = cc._decorator; @ccclass export default class GameManager extends cc.Component { @property(cc.Label) label: cc.Label = null; @property text: string = 'hello'; static _instance : GameManager = null; @property({type: [cc.Prefab], tooltip:"方块数组"}) Block_Array : Array = []; @property({type: [cc.Prefab], tooltip:"墙壁数组"}) Wall_Prefab : Array = []; @property({type: [cc.SpriteAtlas], tooltip:"方块颜色"}) Block_Color : Array = []; particleEffects: cc.ParticleAsset[]; // @property({type: [cc.ParticleSystem], tooltip:"粒子数组"}) // particleEffects : Array = []; load1 :boolean = false; load2 :boolean = false; load3 :boolean = false; load4 :boolean = false; load5 :boolean = false; scheduleCallback: any; timeNumber: number; // LIFE-CYCLE CALLBACKS: onLoad () { window.initMgr(); this.timeNumber = 3; this.startTimeCutDown(); cc.fx.GameConfig.init(true); cc.fx.GameConfig.GM_INFO.gameState = false; this.readMusicConfig(); console.log("音乐开关",cc.fx.GameConfig.GM_INFO.musicOpen); cc.fx.AudioManager._instance.playMusicGame(); this.load1 = this.load2 = this.load3 = this.load4 = this.load5 =false; setTimeout(() => { this.readUserData(); }, 200); if (GameManager._instance == null) { GameManager._instance = this; cc.game.addPersistRootNode(this.node); } else { return; } const path = 'prefab/block'; const path2 = 'prefab/wall'; cc.resources.loadDir(path, cc.Prefab, (err, assets: cc.Prefab[]) => { if (err) { console.error('动态加载 Prefab 失败:', err); cc.director.loadScene("LoadScene"); return; } // 将加载的 Prefab 赋值给 Block_Array this.Block_Array = assets; console.log('方块加载成功,共加载了', this.Block_Array.length, '个方块'); this.setSort(); this.load1 = true; }); cc.resources.loadDir(path2, cc.Prefab, (err, assets: cc.Prefab[]) => { if (err) { console.error('动态加载 Prefab 失败:', err); cc.director.loadScene("LoadScene"); return; } // 将加载的 Prefab 赋值给 Block_Array this.Wall_Prefab = assets; this.load2 = true; console.log('墙加载成功,共加载了', this.Wall_Prefab.length, '个墙'); this.setWallPrefabSort(); }); // debugger; // setTimeout(() => { // cc.director.preloadScene("HomeScene", (err) => { // if (err) { // console.error('预加载 HomeScene 场景失败:', err); // return; // } // }); // }, 1000); // 检测微信小游戏切到后台 if (cc.sys.platform === cc.sys.WECHAT_GAME) { //@ts-ignore wx.onHide(() => { this.onHide(); }); // 检测微信小游戏回到前台 //@ts-ignore wx.onShow(() => { this.onShow(); }); } } onHide () { cc.audioEngine.stopMusic(); cc.game.pause(); } onShow () { cc.audioEngine.resumeMusic(); cc.game.resume(); } loadParticleEffects() { } 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) => { 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(){ console.log("进入场景之前_____________",cc.fx.GameConfig.GM_INFO.first); cc.director.loadScene("HomeScene"); } returnHome(){ cc.tween(this.node.getChildByName("Game")) .to(0.5, {opacity: 100}) .call(() => { // 预加载成功后加载场景 cc.director.loadScene("HomeScene", (err) => { if (err) { console.error('加载 HomeScene 场景失败:', err); } else { cc.director.loadScene("HomeScene"); } }); }) .start(); cc.tween(this.node.getChildByName("mask")) .to(0.5,{opacity: 255}) .start(); // cc.loader.releaseAll(); // 预加载 HomeScene 场景 } readUserData(retryCount = 0){ //@ts-ignore if (typeof wx !== 'undefined' && wx !== null) { let levelInfo = cc.fx.StorageMessage.getStorage("level"); //旧的读取数据设置数据方法,以强联网为主 if(levelInfo == undefined || levelInfo == "" || levelInfo == null){ this.oldReadData(retryCount); } //新的读取数据设置方法,以本地为主 else{ this.newReadData(); } console.log("即将读取体力值"); cc.fx.GameTool.getHealth((data)=>{ console.log("体力值完成进入游戏"); this.load5 = true; }); } else{ this.load3 = true; this.load4 = true; this.load5 = true; cc.fx.GameTool.getHealth(null); } // 存储用户数据 } readMusicConfig(){ let audioInfo = cc.fx.StorageMessage.getStorage("music"); if(audioInfo == undefined || audioInfo == "" || audioInfo == null){ audioInfo = { "musicOpen": true, //音乐 "effectOpen": true, //音效 "vibrateOpen": true, //震动 } cc.fx.StorageMessage.setStorage("music",audioInfo); } else{ cc.fx.GameConfig.GM_INFO.musicOpen = audioInfo.musicOpen; cc.fx.GameConfig.GM_INFO.effectOpen = audioInfo.effectOpen; cc.fx.GameConfig.GM_INFO.vibrateOpen = audioInfo.vibrateOpen; } } //新用户,有本地缓存读取配置 newReadData(){ console.log("读取新信息"); let openid = cc.fx.StorageMessage.getStorage("openid"); if(openid == null || openid == "" || openid == undefined){ console.log("没有openid"); //@ts-ignore wx.cloud.callFunction({ name: 'userData', data: { action: 'read' }, success: res => { console.log('读取用户数据成功', res.result) if(res.result.code == 404 && res.result.message == "未找到用户数据"){ } else if(res.result.code == 200){ if(res.result.data){ cc.fx.GameConfig.GM_INFO.openid = res.result.openid; cc.fx.GameConfig.GM_INFO.username = res.result.data.username; cc.fx.GameConfig.GM_INFO.useravatar = res.result.data.useravatar; const register_time = res.result.data.register_time; MiniGameSdk.API.shushu_userSet(register_time); cc.fx.StorageMessage.setStorage("openid",cc.fx.GameConfig.GM_INFO.openid); } } }, fail: err => { console.error('读取用户数据失败', err) } }) } else{ if(openid) cc.fx.GameConfig.GM_INFO.openid = openid; } //等级信息 cc.fx.GameTool.getUserLevel((data) =>{ const timestamp = Date.now(); let levelInfo = cc.fx.StorageMessage.getStorage("level"); if(data.result.code == 404 && data.result.message == "未找到关卡数据"){ // console.log("没有等级信息,从用户接口拿到数据"); if(levelInfo.level){ cc.fx.GameConfig.GM_INFO.level = levelInfo.level; } this.load4 = true; cc.fx.GameTool.setUserLevel((data)=>{ }); } else if(data.result.code == 200){ // console.log("有等级信息,从关卡接口拿到数据",data.result.data); //游戏前端存储 新于服务器端,以游戏前端信息为主,放服务器存储 let temp = data.result.timestamp - levelInfo.timestamp; console.log("等级时间差:",temp); if((data.result.timestamp - levelInfo.timestamp) < 10000){ if(levelInfo.level){ console.log("以游戏前端等级为准",data.result.data); cc.fx.GameConfig.GM_INFO.level = levelInfo.level; // console.log("等级为:",cc.fx.GameConfig.GM_INFO.level); cc.fx.GameTool.setUserLevel((data)=>{ }); } } //服务器端存储时间新于游戏端,以服务器端为主,往前端存储 else{ console.log("以服务器等级为准",data.result.data); cc.fx.GameConfig.GM_INFO.level = data.result.data; levelInfo.level = cc.fx.GameConfig.GM_INFO.level; levelInfo.timestamp = timestamp; // console.log("1111111存储关卡数据:",cc.fx.GameConfig.GM_INFO.level); cc.fx.StorageMessage.setStorage("level",levelInfo); } this.load4 = true; } }); //金币信息 cc.fx.GameTool.getUserCoin((data) =>{ const timestamp = Date.now(); let coinInfo = cc.fx.StorageMessage.getStorage("coin"); if(data.result.code == 404 && data.result.message == "未找到金币数据"){ if(coinInfo.coin) cc.fx.GameConfig.GM_INFO.coin = coinInfo.coin; console.log("没有金币信息,从用户接口拿到数据",cc.fx.GameConfig.GM_INFO.coin); this.load3 = true; cc.fx.GameTool.setUserCoin((data)=>{ }); } else if(data.result.code == 200){ // console.log("有金币信息,从金币接口拿到数据",data.result.data); //游戏前端存储 新于服务器端,以游戏前端信息为主,放服务器存储 let temp = data.result.timestamp - coinInfo.timestamp; console.log("金币时间差:",temp); if((data.result.timestamp - coinInfo.timestamp) < 10000){ console.log("以前端金幣为准:",coinInfo); if(coinInfo.coin) cc.fx.GameConfig.GM_INFO.coin = coinInfo.coin; else{ cc.fx.GameConfig.GM_INFO.coin = data.result.data; coinInfo.coin = cc.fx.GameConfig.GM_INFO.coin; coinInfo.timestamp = timestamp; console.log("11111111111"); cc.fx.StorageMessage.setStorage("coin",coinInfo); } console.log("改变后金币:",cc.fx.GameConfig.GM_INFO.coin); cc.fx.GameTool.setUserCoin((data)=>{ }); } //服务器端存储时间新于游戏端,以服务器端为主,往前端存储 else{ console.log("以服务器金幣为准:",data.result.data); cc.fx.GameConfig.GM_INFO.coin = data.result.data; coinInfo.coin = cc.fx.GameConfig.GM_INFO.coin; coinInfo.timestamp = timestamp; console.log("2222222222"); cc.fx.StorageMessage.setStorage("coin",coinInfo); } this.load3 = true; } }); //道具信息 cc.fx.GameTool.getUserProp((data) =>{ const timestamp = Date.now(); let propInfo = cc.fx.StorageMessage.getStorage("prop"); if(data.result.code == 404 && data.result.message == "未找到道具数据"){ console.log("没有道具信息,从用户接口拿到数据",propInfo); if(propInfo.freezeAmount == undefined || propInfo.hammerAmount == undefined || propInfo.magicAmount == undefined){ console.log("2222222道具数据异常"); cc.fx.GameConfig.GM_INFO.freezeAmount = 0; cc.fx.GameConfig.GM_INFO.hammerAmount = 0; cc.fx.GameConfig.GM_INFO.magicAmoun = 0; let propInfoNew = { "freezeAmount":cc.fx.GameConfig.GM_INFO.freezeAmount, "hammerAmount":cc.fx.GameConfig.GM_INFO.hammerAmount, "magicAmount":cc.fx.GameConfig.GM_INFO.magicAmoun, "timestamp":timestamp } console.log("1111111上传道具信息:",propInfoNew); cc.fx.StorageMessage.setStorage("prop",propInfoNew); } else{ // cc.fx.GameConfig.GM_INFO.freezeAmount = data.result.data.freeze; // cc.fx.GameConfig.GM_INFO.hammerAmount = data.result.data.hammer; // cc.fx.GameConfig.GM_INFO.magicAmount = data.result.data.magic_wand; cc.fx.GameConfig.GM_INFO.freezeAmount = propInfo.freezeAmount; cc.fx.GameConfig.GM_INFO.hammerAmount = propInfo.hammerAmount; cc.fx.GameConfig.GM_INFO.magicAmount = propInfo.magicAmount; } // cc.fx.GameConfig.GM_INFO.freezeAmount = propInfo.freezeAmount; // cc.fx.GameConfig.GM_INFO.hammerAmount = propInfo.hammerAmount; // cc.fx.GameConfig.GM_INFO.magicAmount = propInfo.magicAmount; cc.fx.GameTool.setUserProp(0,0,(data)=>{ }); } else if(data.result.code == 200){ // console.log("本地时间戳",propInfo.timestamp,"服务器时间戳",data.result.timestamp); if((data.result.timestamp - propInfo.timestamp) < 10000){ console.log("以前端道具为主:",propInfo); if(propInfo.freezeAmount == undefined || propInfo.hammerAmount == undefined || propInfo.magicAmount == undefined){ console.log("111111道具数据异常",data.result.data); cc.fx.GameConfig.GM_INFO.freezeAmount = data.result.data.freeze; cc.fx.GameConfig.GM_INFO.hammerAmount = data.result.data.hammer; cc.fx.GameConfig.GM_INFO.magicAmount = data.result.data.magic_wand; let propInfoNew = { "freezeAmount":cc.fx.GameConfig.GM_INFO.freezeAmount, "hammerAmount":cc.fx.GameConfig.GM_INFO.hammerAmount, "magicAmount":cc.fx.GameConfig.GM_INFO.magicAmount, "timestamp":timestamp } console.log("333333上传道具信息:",propInfoNew); cc.fx.StorageMessage.setStorage("prop",propInfoNew); } else{ console.log("道具数据正常"); cc.fx.GameConfig.GM_INFO.freezeAmount = propInfo.freezeAmount; cc.fx.GameConfig.GM_INFO.hammerAmount = propInfo.hammerAmount; cc.fx.GameConfig.GM_INFO.magicAmount = propInfo.magicAmount; cc.fx.GameTool.setUserProp(0,0,(data)=>{ }); } } else{ cc.fx.GameConfig.GM_INFO.freezeAmount = data.result.data.freeze; cc.fx.GameConfig.GM_INFO.hammerAmount = data.result.data.hammer; cc.fx.GameConfig.GM_INFO.magicAmount = data.result.data.magic_wand; let propInfoNew = { "freezeAmount":cc.fx.GameConfig.GM_INFO.freezeAmount, "hammerAmount":cc.fx.GameConfig.GM_INFO.hammerAmount, "magicAmount":cc.fx.GameConfig.GM_INFO.magicAmount, "timestamp":timestamp } console.log("22222222上传道具信息:",propInfoNew,data.result); cc.fx.StorageMessage.setStorage("prop",propInfoNew); } } }); } //旧用户,无本地缓存读取配置 oldReadData(retryCount:number){ console.log("读取旧信息"); const MAX_RETRIES = 15; const timestamp = Date.now(); // 读取用户数据 //@ts-ignore wx.cloud.callFunction({ name: 'userData', data: { action: 'read' }, success: res => { console.log('读取用户数据成功', res.result) if(res.result.code == 404 && res.result.message == "未找到用户数据"){ if(res.result.openid){ cc.fx.GameConfig.GM_INFO.openid = res.result.openid } cc.fx.GameConfig.GM_INFO.first = true; this.load3 = true; this.load4 = true; let levelInfo = {"level":0,"timestamp":timestamp}; cc.fx.StorageMessage.setStorage("level",levelInfo); let coinInfo = {"coin":0,"timestamp":timestamp}; console.log("33333333333"); cc.fx.StorageMessage.setStorage("coin",coinInfo); let propInfo = { "freezeAmount":0, "hammerAmount":0, "magicAmount":0, "timestamp":timestamp, } cc.fx.StorageMessage.setStorage("prop",propInfo); cc.fx.GameTool.setUserInfo((data)=>{ if(data.result.code == 200){ console.log("上传用户信息成功",data); //@ts-ignore wx.cloud.callFunction({ name: 'userData', data: { action: 'read' }, success: res => { console.log("上传后,读取用户信息,为上报注册时间") if(res.result.code == 200){ const time = res.result.data.register_time; MiniGameSdk.API.shushu_userSet(time); } } }) } }); console.log("服务器也没有金币信息",cc.fx.GameConfig.GM_INFO.coin); cc.fx.GameTool.setUserCoin(cc.fx.GameConfig.GM_INFO.coin,(data)=>{ }); cc.fx.GameTool.setUserLevel((data)=>{ }); setTimeout(() => { cc.fx.GameConfig.GM_INFO.freezeAmount = 0; cc.fx.GameConfig.GM_INFO.hammerAmount = 0; cc.fx.GameConfig.GM_INFO.magicAmount = 0; cc.fx.GameTool.setUserProp(0,0,(data)=>{ if(data.result.code == 200){ console.log("上传道具信息成功",data); } else{ MiniGameSdk.API.showToast("网络异常,正在努力加载"); setTimeout(() => { this.oldReadData(0); }, 1000); } }); }, 0); } else if(res.result.code == 200){ if(res.result.data){ cc.fx.GameConfig.GM_INFO.openid = res.result.openid; cc.fx.GameConfig.GM_INFO.level = res.result.data.level; cc.fx.GameConfig.GM_INFO.coin = res.result.data.coinAmount; cc.fx.GameConfig.GM_INFO.freezeAmount = res.result.data.freezeAmount; cc.fx.GameConfig.GM_INFO.hammerAmount = res.result.data.hammerAmount; cc.fx.GameConfig.GM_INFO.magicAmount = res.result.data.magicAmount; cc.fx.GameConfig.GM_INFO.username = res.result.data.username; cc.fx.GameConfig.GM_INFO.useravatar = res.result.data.useravatar; cc.fx.StorageMessage.setStorage("openid",cc.fx.GameConfig.GM_INFO.openid); const register_time = res.result.data.register_time; MiniGameSdk.API.shushu_userSet(register_time); } setTimeout(() => { cc.fx.GameTool.getUserCoin((data) =>{ if(data.result.code == 404 && data.result.message == "未找到金币数据"){ let coinInfo = {"coin":0,"timestamp":timestamp}; cc.fx.GameConfig.GM_INFO.coin = 0; cc.fx.StorageMessage.setStorage("coin",coinInfo); console.log("没有金币信息,从用户接口拿到数据",cc.fx.GameConfig.GM_INFO.coin); cc.fx.GameTool.setUserCoin((data)=>{ // console.log("上传",data); this.load3 = true; }); } else if(data.result.code == 200){ // console.log("有金币信息,从金币接口拿到数据",data.result.data); cc.fx.GameConfig.GM_INFO.coin = data.result.data; let coinInfo = {"coin":cc.fx.GameConfig.GM_INFO.coin,"timestamp":timestamp}; console.log("存储金币信息:",cc.fx.GameConfig.GM_INFO.coin); console.log("4444444444"); cc.fx.StorageMessage.setStorage("coin",coinInfo); this.load3 = true; } }) }, 500); cc.fx.GameTool.getUserLevel((data) =>{ if(data.result.code == 404 && data.result.message == "未找到关卡数据"){ console.log("没有等级信息,从用户接口拿到数据"); let levelInfo = {"level":0,"timestamp":timestamp}; // console.log("333333存储关卡数据:",levelInfo); cc.fx.GameConfig.GM_INFO.level = 0; cc.fx.StorageMessage.setStorage("level",levelInfo); cc.fx.GameTool.setUserLevel((data)=>{ console.log("拿到的数据",data); this.load4 = true; }); } else if(data.result.code == 200){ console.log("有等级信息,从关卡接口拿到数据",data.result.data); cc.fx.GameConfig.GM_INFO.level = data.result.data; let levelInfo = {"level":cc.fx.GameConfig.GM_INFO.level,"timestamp":timestamp}; // console.log("444444存储关卡信息:",levelInfo); cc.fx.StorageMessage.setStorage("level",levelInfo); this.load4 = true; } }) setTimeout(() => { cc.fx.GameTool.getUserProp((data) =>{ if(data.result.code == 404 && data.result.message == "未找到道具数据"){ console.log("没有道具信息,从用户接口拿到数据"); cc.fx.GameConfig.GM_INFO.freezeAmount = 0; cc.fx.GameConfig.GM_INFO.hammerAmount = 0; cc.fx.GameConfig.GM_INFO.magicAmount = 0; let propInfo = { "freezeAmount":0, "hammerAmount":0, "magicAmount":0, "timestamp":timestamp, } console.log("上传道具信息:",propInfo); cc.fx.StorageMessage.setStorage("prop",propInfo); cc.fx.GameTool.setUserProp(0,0,(data)=>{ }); } else if(data.result.code == 200){ console.log("有道具信息,从道具接口拿到数据",data.result.data); cc.fx.GameConfig.GM_INFO.freezeAmount = data.result.data.freeze || 0; cc.fx.GameConfig.GM_INFO.hammerAmount = data.result.data.hammer || 0; cc.fx.GameConfig.GM_INFO.magicAmount = data.result.data.magic_wand || 0; let propInfo = { "freezeAmount":cc.fx.GameConfig.GM_INFO.freezeAmount, "hammerAmount":cc.fx.GameConfig.GM_INFO.hammerAmount, "magicAmount":cc.fx.GameConfig.GM_INFO.magicAmount, "timestamp":timestamp, } console.log("上传道具信息:",propInfo); cc.fx.StorageMessage.setStorage("prop",propInfo); } }) }, 0); } }, fail: err => { console.error('读取用户数据失败', err) if (retryCount < MAX_RETRIES) { console.error(`读取用户数据失败,第 ${retryCount + 1} 次重试,错误信息:`, err); // 延迟 2 秒后重试 setTimeout(() => { this.readUserData(retryCount + 1); }, 2000); } else { console.error('读取用户数据失败,达到最大重试次数,退出游戏', err); // 退出游戏 cc.game.end(); } } }) } setUserData(){ cc.fx.GameConfig.GameTool((data)=>{ console.log("上传",data); }) } startTimeCutDown(){ this.scheduleCallback = function(){ if(this.timeNumber <= 0){ this.stopTimeCutDown(); } else{ this.timeNumber -= 1; } }.bind(this); this.schedule(this.scheduleCallback, 1); } stopTimeCutDown(){ if(this.scheduleCallback){ this.unschedule(this.scheduleCallback); } } update (dt) { if(this.load1 && this.load2 && this.load3 && this.load4 && this.load5 && this.timeNumber <= 0){ this.load1 = this.load2 = false; MiniGameSdk.API.shushu_Init(); this.startGame(); } } }