// 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 Utils from "./module/Pay/Utils"; 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; load6: boolean = false; scheduleCallback: any; timeNumber: number; nowTime: number; // LIFE-CYCLE CALLBACKS: /** 游戏入口初始化 */ onLoad() { window.initMgr(); this.timeNumber = 1; this.startTimeCutDown(); cc.fx.GameConfig.init(true); cc.fx.GameConfig.GM_INFO.gameState = false; this.readMusicConfig(); this.load1 = this.load2 = this.load3 = this.load4 = this.load5 = this.load6 = false; setTimeout(() => { this.getSetting(); this.readUserData(); this.getShareInfo(); }, 100); if (GameManager._instance == null) { GameManager._instance = this; cc.game.addPersistRootNode(this.node); } else { return; } // 检测微信小游戏切到后台 if (cc.sys.platform === cc.sys.WECHAT_GAME) { //@ts-ignore wx.onHide(() => { this.onHide(); }); // 检测微信小游戏回到前台 //@ts-ignore wx.onShow(() => { this.onShow(); }); } } start() { setTimeout(() => { const path = 'prefab/block'; const path2 = 'prefab/wall'; cc.resources.loadDir(path, cc.Prefab, (err, assets: cc.Prefab[]) => { if (err) { cc.director.loadScene("LoadScene"); return; } // 将加载的 Prefab 赋值给 Block_Array this.Block_Array = assets; this.setSort(); this.load1 = true; }); cc.resources.loadDir(path2, cc.Prefab, (err, assets: cc.Prefab[]) => { if (err) { cc.director.loadScene("LoadScene"); return; } // 将加载的 Prefab 赋值给 Block_Array this.Wall_Prefab = assets; this.load2 = true; this.setWallPrefabSort(); }); }, 100); } onHide() { cc.audioEngine.stopMusic(); cc.game.pause(); } onShow() { cc.audioEngine.resumeMusic(); cc.game.resume(); } //#region 给加载好的墙壁资源排序 /** 给加载好的墙壁资源排序,防止乱序 */ setWallPrefabSort() { const order = ['down', 'downleft', 'downright', 'left', 'leftdown', 'leftup', 'right', 'rightdown', 'rightup', '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; }); } /** 给加载好的方块资源排序,防止乱序 */ 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; }); } //#region 开始游戏 /** 开始游戏,执行逻辑 */ startGame() { // 加载成功后进入 HomeScene cc.assetManager.loadBundle('shop', (err, bundle) => { if (err) { console.error('加载 shop 失败:', err); } else { // 加载成功后进入 HomeScene cc.assetManager.loadBundle('music', (err, bundle) => { if (err) { console.error('加载 music bundle 失败:', err); // 加载失败时仍尝试进入 HomeScene cc.director.loadScene("HomeScene"); } else { } cc.director.loadScene("HomeScene"); }); } }); // 加载 music bundle } //#region 微信登录,以及读取用户信息 /** 微信登录,以及读取用户信息 */ readUserData(retryCount = 0) { this.load3 = true; this.load4 = true; this.load5 = true; this.load6 = true; let levelInfo = cc.fx.StorageMessage.getStorage("level"); //如果本地缓存没有关卡信息,默认为服务器信息为主 if (levelInfo == undefined || levelInfo == "" || levelInfo == null) { // this.getUserDataToServer(data.data); const timestamp = Date.now(); cc.fx.GameConfig.GM_INFO.level = 0; let levelInfo = { "level": cc.fx.GameConfig.GM_INFO.level, "timestamp": timestamp }; cc.fx.StorageMessage.setStorage("level", levelInfo); cc.fx.GameConfig.GM_INFO.first = true; // this.oldReadData(retryCount); } else { cc.fx.GameConfig.GM_INFO.level = levelInfo; } cc.fx.GameTool.getHealth(null); //@ts-ignore // if (typeof wx !== 'undefined' && wx !== null) { // MiniGameSdk.API.shushu_Init(); // this.nowTime = Date.now(); // // 最大重试次数 // const MAX_RETRIES = 30; // // 延迟时间数组,按照 1 秒 3 次、2 秒 5 次、5 秒 6 次、15 秒 5 次的规则生成 // const delays = [ // ...Array(3).fill(2000), // ...Array(5).fill(3000), // ...Array(6).fill(5000), // ...Array(5).fill(15000) // ]; // //cc.fx.GameConfig.GM_INFO.shushu_DistinctId // const attemptUserInfo = () => { // Utils.getUserInfo((data) => { // if (data.code == 1) { // 假设返回数据中有 success 字段表示成功 // console.log("登錄", data); // if (data.data.openid) { // cc.fx.GameConfig.GM_INFO.openid = data.data.openid; // cc.fx.StorageMessage.setStorage("openid", cc.fx.GameConfig.GM_INFO.openid); // } // if (data.data._id) { // cc.fx.GameConfig.GM_INFO.uid = data.data._id; // cc.fx.StorageMessage.setStorage("uid", data.data._id); // } // if (data.data.onlyId) { // cc.fx.GameConfig.GM_INFO.userId = data.data.onlyId; // } // if (data.data.outTradeNo.length > 0) { // cc.fx.GameConfig.GM_INFO.allOutTradeNo = []; // cc.fx.GameConfig.GM_INFO.allOutTradeNo = data.data.outTradeNo; // } // if (data.data.shareLv) { // if (data.data.shareLv.length > 0) { // cc.fx.GameConfig.GM_INFO.helpLevel = data.data.shareLv[0].lv; // } // } // if (data.data.username) { // cc.fx.GameConfig.GM_INFO.username = data.data.username; // } // if (data.data.useravatar) { // cc.fx.GameConfig.GM_INFO.useravatarIcon = data.data.useravatar; // if (cc.fx.GameConfig.GM_INFO.useravatarIcon.length < 10) // cc.fx.GameConfig.GM_INFO.useravatarIcon = "icon_" + cc.fx.GameConfig.GM_INFO.useravatarIcon // } // if (data.data.useravatarIcon) { // cc.fx.GameConfig.GM_INFO.useravaterkuang = data.data.useravatarIcon; // cc.fx.GameConfig.GM_INFO.useravaterkuang = "kuang_" + (parseInt(cc.fx.GameConfig.GM_INFO.useravaterkuang) + 1); // } // if (data.data.task) { // let task = JSON.parse(data.data.task); // cc.fx.GameConfig.GM_INFO.tasks.levelPass = task["levelPass"]; // cc.fx.GameConfig.GM_INFO.tasks.share = task["share"]; // cc.fx.GameConfig.GM_INFO.tasks.useEnergy = task["useEnergy"]; // cc.fx.GameConfig.GM_INFO.tasks.useProp = task["useProp"]; // } // this.setUserPower(data); // this.setmonth(data); // this.setRevive(data); // let levelInfo = cc.fx.StorageMessage.getStorage("level"); // //如果本地缓存没有关卡信息,默认为服务器信息为主 // if (levelInfo == undefined || levelInfo == "" || levelInfo == null) { // this.getUserDataToServer(data.data); // // this.oldReadData(retryCount); // } // //新的读取数据设置方法,以本地为主 // else { // this.getUserDataToLocal(data.data); // // this.newReadData(); // } // cc.fx.GameTool.getHealth((data) => { // this.load5 = true; // }); // this.load6 = true; // } // else { // if (retryCount < MAX_RETRIES && retryCount < delays.length) { // const delay = delays[retryCount]; // console.error(`获取用户信息失败,第 ${retryCount + 1} 次重试,将在 ${delay / 1000} 秒后重试`); // setTimeout(() => { // retryCount++; // attemptUserInfo(); // }, delay); // } else { // console.error('获取用户信息失败,达到最大重试次数,退出游戏'); // // 退出游戏 // cc.game.end(); // } // } // }); // }; // attemptUserInfo(); // } // else { // this.load3 = true; // this.load4 = true; // this.load5 = true; // this.load6 = true; // cc.fx.GameTool.getHealth(null); // } // 存储用户数据 } //#region 读取音乐配置 /** 读取音乐配置 */ 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; } } //#region 老用户,读取数据 /** 老用户,有本地缓存数据,与服务器数据做比对,哪边关卡等级高以哪边为主 */ getUserDataToLocal(data) { let levelInfo = cc.fx.StorageMessage.getStorage("level"); let coinInfo = cc.fx.StorageMessage.getStorage("coin"); let propInfo = cc.fx.StorageMessage.getStorage("prop"); if (data.levelAmount == null || data.levelAmount == undefined) { data.levelAmount = 0; } if (data.coinAmount == null || data.coinAmount == undefined) { data.coinAmount = 0; } if (levelInfo.level > data.levelAmount) { cc.fx.GameConfig.GM_INFO.level = levelInfo.level; //// cc.fx.GameConfig.GM_INFO.coin = coinInfo.coin; cc.fx.GameConfig.GM_INFO.freezeAmount = propInfo.freezeAmount; cc.fx.GameConfig.GM_INFO.hammerAmount = propInfo.hammerAmount; cc.fx.GameConfig.GM_INFO.magicAmount = propInfo.magicAmount; const timestamp = Date.now(); //// if (coinInfo.coin != data.coinAmount) { // if (coinInfo == undefined || coinInfo.coin == null) { // //// let coinInfo = { "coin": cc.fx.GameConfig.GM_INFO.coin, "timestamp": timestamp }; // cc.fx.StorageMessage.setStorage("coin", coinInfo); // } // else { // cc.fx.GameTool.setUserCoin((data) => { // }); // } // } if (levelInfo.level != data.levelAmount) { if (levelInfo.level == null || levelInfo == undefined) { let levelInfo = { "level": cc.fx.GameConfig.GM_INFO.level, "timestamp": timestamp }; cc.fx.StorageMessage.setStorage("level", levelInfo); } else { cc.fx.GameTool.setUserLevel((data) => { }); } } if (propInfo.freezeAmount != data.freezeAmount || propInfo.hammerAmount != data.hammerAmount || propInfo.magicAmount != data.magicAmount) { cc.fx.GameTool.setUserProp(0, 0, (data) => { }) } this.load3 = true; this.load4 = true; } else { if (data.levelAmount == null || data.levelAmount == undefined) { data.levelAmount = cc.fx.GameConfig.GM_INFO.level; cc.fx.GameTool.setUserLevel((data) => { }); } //// if (data.coinAmount == null || data.coinAmount == undefined) { // data.coinAmount = cc.fx.GameConfig.GM_INFO.coin; // cc.fx.GameTool.setUserCoin((data) => { // }); // } const timestamp = Date.now(); let levelInfo = { "level": data.levelAmount, "timestamp": timestamp }; cc.fx.StorageMessage.setStorage("level", levelInfo); let coinInfo = { "coin": data.coinAmount, "timestamp": timestamp }; cc.fx.StorageMessage.setStorage("coin", coinInfo); let propInfo = { "freezeAmount": data.freezeAmount, "hammerAmount": data.hammerAmount, "magicAmount": data.magicAmount, "timestamp": timestamp, } cc.fx.GameConfig.GM_INFO.freezeAmount = data.freezeAmount; cc.fx.GameConfig.GM_INFO.hammerAmount = data.hammerAmount; cc.fx.GameConfig.GM_INFO.magicAmount = data.magicAmount; cc.fx.GameConfig.GM_INFO.level = data.levelAmount; //// cc.fx.GameConfig.GM_INFO.coin = data.coinAmount; cc.fx.StorageMessage.setStorage("prop", propInfo); this.load3 = true; this.load4 = true; } } //#region 新用户,读取数据 /** 本地没信息,新用户,或者清缓存用户 */ getUserDataToServer(data) { const timestamp = Date.now(); if (data) { if (data.isFirst == true) { cc.fx.GameConfig.GM_INFO.first = true; if (data.register_time) { const time = data.register_time; let share = cc.fx.GameTool.isFromShareByScene(); MiniGameSdk.API.shushu_userSet(time, share); } } else { } this.load3 = true; this.load4 = true; if (data.levelAmount == null || data.levelAmount == undefined) { data.levelAmount = cc.fx.GameConfig.GM_INFO.level; cc.fx.GameTool.setUserLevel((data) => { }); } //// if (data.coinAmount == null || data.coinAmount == undefined) { // data.coinAmount = cc.fx.GameConfig.GM_INFO.coin; // cc.fx.GameTool.setUserCoin((data) => { // }); // } let levelInfo = { "level": data.levelAmount, "timestamp": timestamp }; cc.fx.StorageMessage.setStorage("level", levelInfo); //// let coinInfo = { "coin": data.coinAmount, "timestamp": timestamp }; //// cc.fx.StorageMessage.setStorage("coin", coinInfo); let propInfo = { "freezeAmount": data.freezeAmount, "hammerAmount": data.hammerAmount, "magicAmount": data.magicAmount, "timestamp": timestamp, } cc.fx.GameConfig.GM_INFO.freezeAmount = data.freezeAmount; cc.fx.GameConfig.GM_INFO.hammerAmount = data.hammerAmount; cc.fx.GameConfig.GM_INFO.magicAmount = data.magicAmount; cc.fx.GameConfig.GM_INFO.level = data.levelAmount; //// cc.fx.GameConfig.GM_INFO.coin = data.coinAmount; cc.fx.StorageMessage.setStorage("prop", propInfo); } } /** 倒计时,保证进度在1秒内不进入游戏 */ 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); } } //#region 设置无限体力信息 /** 设置无限体力信息 */ setUserPower(data) { let nowTime = Math.floor(Date.now() / 1000); let powerTime = cc.fx.StorageMessage.getStorage("userPowerTime"); //本地没缓存 if (powerTime == "undifend" || powerTime == null || powerTime == "" || powerTime == 0) { //本地没缓存,但是服务器有缓存,判断服务器的无限体力时间是否过期 if (data.data.userPowerTime && data.data.userPowerTime != 0) { powerTime = data.data.userPowerTime; if (powerTime > nowTime) { cc.fx.GameConfig.GM_INFO.userPowerTime = powerTime; cc.fx.StorageMessage.setStorage("userPowerTime", powerTime); } else { cc.fx.GameConfig.GM_INFO.userPowerTime = 0; cc.fx.StorageMessage.setStorage("userPowerTime", 0); } } //本地没缓存,服务器也没缓存 else { powerTime = 0; cc.fx.GameConfig.GM_INFO.userPowerTime = 0; cc.fx.StorageMessage.setStorage("userPowerTime", 0); } } //本地有缓存 else { //本地有缓存,且服务器有缓存 if (data.data.userPowerTime && data.data.userPowerTime != 0) { //服务器缓存大于本地缓存,以服务器缓存为主 if (data.data.userPowerTime > powerTime) { powerTime = data.data.userPowerTime; if (powerTime > nowTime) { cc.fx.GameConfig.GM_INFO.userPowerTime = powerTime; cc.fx.StorageMessage.setStorage("userPowerTime", powerTime); } else { cc.fx.GameConfig.GM_INFO.userPowerTime = 0; cc.fx.StorageMessage.setStorage("userPowerTime", 0); } } //服务器缓存小于本地缓存,以本地缓存为主 else { if (powerTime > nowTime) { cc.fx.GameConfig.GM_INFO.userPowerTime = powerTime; cc.fx.StorageMessage.setStorage("userPowerTime", powerTime); } else { cc.fx.GameConfig.GM_INFO.userPowerTime = 0; cc.fx.StorageMessage.setStorage("userPowerTime", 0); } } } //本地有缓存,服务器没缓存 else { if (powerTime > nowTime) { cc.fx.GameConfig.GM_INFO.userPowerTime = powerTime; cc.fx.StorageMessage.setStorage("userPowerTime", powerTime); } else { cc.fx.GameConfig.GM_INFO.userPowerTime = 0; cc.fx.StorageMessage.setStorage("userPowerTime", 0); } } } } //#region 设置月卡信息 /** 设置月卡信息 */ setmonth(data) { //如果给的时间戳大于当前时间hpmax=7,否则等于5 let nowTime = Math.floor(Date.now() / 1000); if (data.data.monthCardTime > nowTime) { cc.fx.GameConfig.GM_INFO.hp_Max = 7; cc.fx.GameConfig.GM_INFO.doubleCoin = 2; } else { cc.fx.GameConfig.GM_INFO.hp_Max = 5; cc.fx.GameConfig.GM_INFO.doubleCoin = 1; } //本地储存当前服务器时间 let dateStr = new Date(data.data.monthCardTime); cc.fx.StorageMessage.setStorage("mCardDate", dateStr); } //#region 复活购买次数初始化 /** 复活购买次数初始化 */ setRevive(data) { cc.fx.GameConfig.GM_INFO.revive = data.data.rebornGiftCount; } //#region 获取有没有分享信息 /** 获取有没有分享信息 */ getShareInfo() { // 检查微信小游戏启动参数 if (cc.sys.platform === cc.sys.WECHAT_GAME) { //@ts-ignore const launchOptions = wx.getLaunchOptionsSync(); const query = launchOptions.query; if (query.level && query.uid) { const level = parseInt(query.level, 10); const uid = query.uid; cc.fx.GameConfig.GM_INFO.otherUid = uid; cc.fx.GameConfig.GM_INFO.otherLevel = level; // 可以在这里处理关卡信息和 UID } } } //#region 获取是否授权 /** 获取是否授权 */ getSetting() { MiniGameSdk.API.getWechatUserInfo((res) => { }) } /** 主循环,判断是否各项加载完成进入游戏 */ update(dt) { if (this.load1 && this.load2 && this.load3 && this.load4 && this.load5 && this.load6 == true && this.timeNumber <= 0) { this.load1 = this.load2 = false; MiniGameSdk.API.shushu_Login(); MiniGameSdk.API.yinli_Init(); MiniGameSdk.API.yinli_Login(); if (cc.fx.GameConfig.GM_INFO.first == true) { const time = Date.now(); let share = cc.fx.GameTool.isFromShareByScene(); MiniGameSdk.API.shushu_userSet(time, share); } this.startGame(); } } }