import { randomRange, view } from "cc"; import GlobalValue from "../Common/GlobalValue"; import SubManager from "../../Sub/SubManager"; import { I_SDK_UserInfo_Callback } from "./SDKManager"; import Utils from "../Common/Utils"; //广告ID const wx_banner_ad_unit_id = 'test' const wx_splash_ad_unit_id = 'test' const wx_video_ad_unit_id = 'test' export class WXSDK{ static g_InGameScene = null; //游戏场景值 private wx_video:any = null; private wx_splash:any = null; private wx_banner:any = null; private wx_video_callback:Function = null; private wx_video_tag:number = null; private wx_gameClub:any = null; //游戏圈按钮 private ShareSTime: any; private ShareCb: any; //分享回调 private shareTxt = ["分享失败", "请分享到一个群", "请分享给一位好友", "分享过于频繁"] //初始化 init(cb: Function = null) { // 保持屏幕常亮 window['wx'].setKeepScreenOn({ keepScreenOn: true }); WXSDK.g_InGameScene = window['wx'].getLaunchOptionsSync().scene; console.log('init 微信 - 进入游戏的场景值', WXSDK.g_InGameScene); //显示分享按钮 window['wx'].showShareMenu({ withShareTicket: true, menus: ["shareAppMessage", "shareTimeline"], }); window['wx'].onShareAppMessage(() => { return this.shareInfo(); }); window['wx'].onShareTimeline(() => { return this.shareInfo(); }) //小游戏回到前台 window['wx'].onShow(this.onWxShow.bind(this)); //小游戏被隐藏 记个时间 window['wx'].onHide(() => { if (this.ShareCb) { this.ShareSTime = new Date().getTime(); console.log("分享时间差 记录:", this.ShareSTime); } }); this.init_video(); //初始化视频广告 this.init_splash(); //初始化插屏广告 this.init_banner(); //初始化Banner广告 弹窗广告 cb && cb(); } //小游戏回到前台 onWxShow(data: any) { console.log("onWxShow:" + JSON.stringify(data)) //返回小游戏场景值 if (data && data.query && data.query.ShareCode) { GlobalValue.ShareTocusid = data.query.ShareCode } if (this.ShareCb) { if (this.ShareSTime) { let nT = new Date().getTime(); console.log("分享时间差 计算:",nT, this.ShareSTime); if (nT - this.ShareSTime > 1500) { let cb = this.ShareCb.succ cb && cb() } else { this.tostErr() } } this.ShareCb = null; } } //分享失败 tostErr() { let rint = Math.floor( randomRange(0, this.shareTxt.length - 1) ) SubManager.ShowPrompt(this.shareTxt[rint]) if (this.ShareCb) { let cb = this.ShareCb.fail cb && cb() } } /**获取用户授权状态 * @param autoKey string 授权类型 userInfo=用户信息,对应接口wx.getUserInfo */ checkAutoSetting(autoKey:string, cb:Function = null) { window['wx'].getSetting({ success(res:any) { console.log("微信 - 检测权限状态 succ:",JSON.stringify(res)) if (autoKey == "userInfo" && res.authSetting['scope.userInfo']) { cb && cb(true) } else { cb && cb(false) } }, fail(res:any) { console.log("微信 - 检测权限状态 fail:",JSON.stringify(res)) cb && cb(false) } }) } /** * 获取个人信息 */ getUserInfo(cb:I_SDK_UserInfo_Callback = null) { console.log("微信 - 正在获取用户信息...") var self = this; window['wx'].getUserInfo({ success: (res) => { console.log("微信 - 获取用户信息成功:", res); cb && cb({avatarUrl:res.userInfo.avatarUrl, nickName:res.userInfo.nickName}) }, fail: (err) => { console.log("微信 - 获取用户信息失败:", err); self.openUserAuthorize(cb); } }) } //申请用户信息授权 openUserAuthorize(cb: any) { var self = this; window['wx'].getSetting({ scope: 'scope.userInfo', success(res:any) { console.log("微信 authorize succ:",JSON.stringify(res)) if (res.authSetting['scope.userInfo']) { self.getUserInfo(cb) } else { let systemInfo = window['wx'].getSystemInfoSync(); let button = window['wx'].createUserInfoButton({ type: 'text', text: '', // @ts-ignore style: { left: 0, top: 0, width: systemInfo.screenWidth, height: systemInfo.screenHeight, backgroundColor: '#00000000',//最后两位为透明度 textAlign: "center", } }); console.log("微信 点击开始游戏授权用户信息") button.onTap((res) => { button.destroy(); // if (res.userInfo) { // console.log(res.userInfo) // //此时可进行登录操作 // cb && cb(res.userInfo) // } console.log("微信 点击Tap", res) self.getUserInfo(cb) }); } }, fail(err) { console.log('微信 - authorize fail', err); } }) } //微信登录 login(cb: Function = null) { window['wx'].login({ success: (res) => { if (res.code) { console.log('微信 - 登录成功', res.code); cb && cb({ platform:1, code: res.code }); } else { console.log('微信 - 登录失败', res.errMsg); cb && cb({ platform:1, code: null }); } }, fail(res: any) { console.log(`微信 login 调用失败`); console.log(res.anonymousCode) cb && cb({ platform:1, code: null }); }, }); } //初始化视频广告 private init_video() { this.wx_video = window['wx'].createRewardedVideoAd({ adUnitId: wx_video_ad_unit_id }); this.wx_video.onLoad(() => { console.log('onLoad event emit'); }); this.wx_video.onError((err) => { console.log('onError event emit', err); }); this.wx_video.onClose(res => { console.log('onClose event emit',res); // 用户点击了【关闭广告】按钮 // 小于 2.1.0 的基础库版本,res 是一个 undefined if (res && res.isEnded || res === undefined) { // 正常播放结束,可以下发游戏奖励 if (this.wx_video_callback) { this.wx_video_callback(this.wx_video_tag); } } else { // 播放中途退出,不下发游戏奖励 //wx_video_callback(-1); } }); } //初始化插屏广告 private init_splash() { // 创建插屏广告实例,提前初始化 if (window['wx'].createInterstitialAd){ this.wx_splash = window['wx'].createInterstitialAd({ adUnitId: wx_splash_ad_unit_id }); this.wx_splash.onLoad(() => { console.log('splash onLoad event emit'); }); this.wx_splash.onError((err) => { console.log('splash onError event emit', err); }); this.wx_splash.onClose(res => { console.log('splash onClose event emit', res); }); } } //初始化Banner private init_banner() { let winSize = window['wx'].getSystemInfoSync(); let bannerHeight = 80; let bannerWidth = 300; this.wx_banner = window['wx'].createBannerAd({ adUnitId: wx_banner_ad_unit_id, adIntervals: 30, style: { left: (winSize.windowWidth- bannerWidth)/2, top: winSize.windowHeight- bannerHeight, width: bannerWidth, } }); //微信缩放后得到banner的真实高度,从新设置banner的top 属性 this.wx_banner.onResize(res => { this.wx_banner.style.top = winSize.windowHeight - this.wx_banner.style.realHeight; }) this.wx_banner.onError(res => { }) } //显示视频广告 show_video(callback:Function, tag:number) { if (wx_video_ad_unit_id == 'test') { console.log('未接入广告ID,视频广告请求直接返回'); callback && callback(); return; } if (this.wx_video) { this.wx_video_callback = callback; this.wx_video_tag = tag; this.wx_video.load() .then(() => { this.wx_video.show() .catch(err => { this.wx_video.load() .then(() => this.wx_video.show()) }) }) } } //显示插屏 show_splash() { // 在适合的场景显示插屏广告 // if (this.wx_splash) { // this.wx_splash.show().catch((err) => { // this.wx_splash.load().then(()=>{ // }) // }) // } if (this.wx_splash) { this.wx_splash .load() .then(() => { this.wx_splash.show(); }) .catch(err => { console.log(err); }); } } //显示Banner show_banner() { if (this.wx_banner) { this.wx_banner.show(); //banner 默认隐藏(hide) 要打开 } } //隐藏Banner hide_banner() { if (this.wx_banner) { this.wx_banner.hide(); //banner 默认隐藏(hide) 要打开 } } /**分享图片*/ private SharePicAry = [ {id:"7wUnG0FFQry/nCdxI9kKYQ==", url:"https://mmocgame.qpic.cn/wechatgame/W9Az4zfwkAvic2MPaoBEdYEMVht0VwJv6eQF2myMU8IIFbQAZ92Fg73Qp9MUdPMj8/0"}, {id:"NCa1cR9YSWinaozMovG6kQ==", url:"https://mmocgame.qpic.cn/wechatgame/uRnpa1JW3rTyYxQHVUI2OaUmHZStMSWfoXPpx7AgceIN2EuqE2DRicDNjcBTA7arK/0"}, {id:"adU43/q3Te+86ThFH+8R+g==", url:"https://mmocgame.qpic.cn/wechatgame/fVu8XV4rOQv0iaLzIr4m67DZAOgN1NDe7jSCDoT2ibHuqRkacaeHCdCopIgLzrlBibR/0"}, {id:"k93MB1OQQzGuHDv6LhlJ4g==", url:"https://mmocgame.qpic.cn/wechatgame/rrYFeia8mywog7QfGagj9Uiad5Sicu3qNhV6IQcgVkZbUjibaWe70SUsvp9vNESBpje7/0"}, {id:"/ry07TA6SXea+AoABH1D+w==", url:"https://mmocgame.qpic.cn/wechatgame/f0cXVicm8xoT33Txqf2o2CRyreAicOiaHh8JFlbxHaDibYWZoBulHTF9v1s3EaUWfaMk/0"}, {id:"hYrwZorvQaOP3XbbC77PZw==", url:"https://mmocgame.qpic.cn/wechatgame/HEsiaI4wLnb2SVCthB5pZeBULvWsk71EdlK1WUXic23cPuzeWribbjibjlebOPyNy1wL/0"}, {id:"nzn7R/iLQoerxHhYbEM6AQ==", url:"https://mmocgame.qpic.cn/wechatgame/fxaAdTaO5GvRicwozj7sfUiat1ef3XLgjicLLZpeJYWtjyBjIhfh7TP2aZzOItwlpff/0"}, {id:"RvJk1ZZzR1iwqKvI39Rt8w==", url:"https://mmocgame.qpic.cn/wechatgame/WibiboKxDQsGxnVMhxebwvouMGnn5MKJibF18lS1iaibo1yrWnoTJgPAIgVX3dZEkV0Ta/0"}, {id:"6OgcDWd5SI2R2SmnOxs3Gw==", url:"https://mmocgame.qpic.cn/wechatgame/bpd6RQyPEB7xsoqyzribiaGnibELo6xARRPSLsgtickwcMHtSv920nweBbxIG7OiaJXFo/0"}, {id:"6qb2SmFBRgi3pv+pUIbulA==", url:"https://mmocgame.qpic.cn/wechatgame/LXCSUXdVagducqPcChicS5yQWqna7oduKCnzwlG11a7W1Lx6Rwv4Y1tBsMVWqP4Fs/0"}, {id:"rdrtaMpJTd6CtMI3dJikHg==", url:"https://mmocgame.qpic.cn/wechatgame/Zzc9s1q36erWTkUxLDjqOus62PTTysBW4PGUaDO5Pr67kT3g9W3HlMakBSiaicxGdH/0"}, {id:"sflrnBurRxC2dow0iuQNEg==", url:"https://mmocgame.qpic.cn/wechatgame/YiacDpfxzCGbXUHmtMmcfr8gIF7DicDib6q0pJaiaWXbTWOBGkCbpeuMic1SMgr91v43K/0"}, {id:"GkB88GpmR6KvjrV3yMxeWA==", url:"https://mmocgame.qpic.cn/wechatgame/f4fzfIKfgFIBFWxjsFibMUHKQA72JutALOXbuM3vaS0W9ZSUjC2rysb5Tic23lQb95/0"}, {id:"UxAhraIxTayr/3Mdhi0Uzg==", url:"https://mmocgame.qpic.cn/wechatgame/qDv24VqH6NBBP0IXNJ2EbSScIic6WsX0KcLJSNs1ThibYJx6QnDnKIT59CcIQSnZvD/0"}, {id:"ISSkaxiBRhyn3yZh2AS0eQ==", url:"https://mmocgame.qpic.cn/wechatgame/22HxqYDEUu1yelwdMR30ntjn6rzaYf8QJgrOkFlteicoqbacSptHiaNgK7cygteg99/0"}, {id:"m0GQ8b4YTU2u1So1Wr9Rjg==", url:"https://mmocgame.qpic.cn/wechatgame/D8nvAYkIticAEYwTBb3uC83TVferTkpqU5Akj8XGwPCYfNZibTeunZVd5ticqHxvgHC/0"}, {id:"F6j57H82QyyiD1i0MaS+0g==", url:"https://mmocgame.qpic.cn/wechatgame/FtniagLR3ueTRx3ibhy98G6pGdC69A38n9jUrVFHEhL9gqceaUnaTpmQHkiaPU1JE4h/0"}, {id:"dqd9Gfx2QGKilvChFwoc7Q==", url:"https://mmocgame.qpic.cn/wechatgame/yauvGchcicTl0zx4dYqfhAxl40k7ZbVM59VbPjDPcouesWbPrpsFQzNvfsSUYwUkb/0"}, ] //分享文本 private ShareTextAry = [ "话术策略大挑战:十句话让 AI 二次元少女心动!", "心动话术挑战,60 位 AI 女友候选等你 Pick!", "二次元话术相亲模拟!60 位 AI 对象等你攻略!", "全 AI 聊天互动!收集二次元少女的心动信号!", "首款 AI 话术策略游戏,攻略个性 AI 二次元女友!", "锻炼你的话术策略,挑战 AI 女友最速结婚路线!", "直男 or 情话海王?60 位 AI 女友检测话术段位!", "高能话术挑战 60 位 AI 少女,解锁专属甜蜜结局!", ] //分享信息 shareInfo() { let rand1 = Utils.getRandomInt(0, this.SharePicAry.length-1); let picmap = this.SharePicAry[rand1]; let rand2 = Utils.getRandomInt(0, this.ShareTextAry.length-1); let text = this.ShareTextAry[rand2]; console.log("分享:", rand1, rand2); return { title: text, query: "ShareCode=" + "user_default", //ModelPlayer.I.getPlayerId(), imageUrl: picmap.url, imageUrlId: picmap.id, } } //主动拉起分享 show_share(rewardCB?:Function) { console.log("主动拉起分享"); let info:any = this.shareInfo(); info.succ = rewardCB; info.fail = null; this.ShareCb = info; window['wx'].shareAppMessage(info); } //获取设备分辨率 getWindowSize() { let windowinfo = window['wx'].getWindowInfo(); return {width:windowinfo.screenWidth, height: windowinfo.screenHeight}; } //显示游戏圈 show_gameClub(leftRatio, topRatio, widthRatio, heightRatio) { console.log("显示游戏圈"); if (this.wx_gameClub) { this.wx_gameClub.show(); }else { let windowinfo = window['wx'].getWindowInfo(); let x = windowinfo.screenWidth * leftRatio; let y = windowinfo.screenHeight * topRatio; let w = windowinfo.screenWidth * widthRatio; //按钮宽高 let h = windowinfo.screenHeight * heightRatio; console.log("游戏圈按钮配置:", windowinfo, leftRatio, topRatio, widthRatio, heightRatio, x, y, w, h); this.wx_gameClub = window['wx'].createGameClubButton({ type: 'string', text: '', // type: 'image', icon: 'green', style: { left: x, //这个坐标对应UI上的按钮时,按钮要勾选适配 top: y, width: w, height: h, }, }) } } //隐藏游戏圈 hide_gameClub() { console.log("隐藏游戏圈"); if (this.wx_gameClub) { this.wx_gameClub.hide(); } } //检查是否支持base64音频播放 checkSupportBase64Audio() { return true; } //播放base64音频 private _innerAudioContext: any = null; private _iacIdx = 0 //音频播放索引 playBase64Audio(base64, loop) { if (!this.checkSupportBase64Audio()) { console.log("微信平台不支持base64音频播放"); return; } let substring = base64; let qianzhui = "data:audio/x-wav;base64," if(base64.startsWith(qianzhui)) { substring = base64.substring(qianzhui.length, base64.length) } let self = this; const fs = window['wx'].getFileSystemManager(); //1.删除上一个音频 const lastPath = window['wx'].env.USER_DATA_PATH + `/ordernew${self._iacIdx}.mp3` console.log("微信 正在删除上一个音频 ->", lastPath); fs.removeSavedFile({ filePath: lastPath, success(res) { console.log("微信 删除上一个音频成功", res); }, fail(err) { console.log("微信 删除上一个音频失败", err); }, complete(res) { console.log("微信 删除上一个音频完成", res); //2.保存当前音频 //这里需要每次保存时换一下名字的原因是:innerAudioContext设置路径时如果路径相同,会认为还是同一个音频,不会重新加载,所以需要每次保存时换一下名字 self._iacIdx++; const audioPath = window['wx'].env.USER_DATA_PATH + `/ordernew${self._iacIdx}.mp3` console.log("微信 正在保存本次音频 ->", audioPath); fs.writeFile({ filePath: audioPath, data: substring, encoding: 'base64', success(res) { if (self._innerAudioContext == null){ self._innerAudioContext = window['wx'].createInnerAudioContext(); // 添加播放结束的回调 self._innerAudioContext.onEnded(() => { console.log("微信 AI语音播放结束") self._innerAudioContext.stop(); // 使用 stop 方法停止音频并重置播放状态 self._innerAudioContext.destroy(); // 销毁音频实例 self._innerAudioContext = null; }); } console.log("微信 播放base64音频", audioPath) self._innerAudioContext.src = audioPath; self._innerAudioContext.play(); // 开始播放音频 }, fail(err) { console.log("微信 保存本次音频失败", err); } }) } }) } }