import { Vec2, Node } from "cc"; import { MiniGameApiBase, getUserInfoParams, toastParams, loadParams, ModalParams, authorizeParams, loginParams, recordedGameScreenParams } from "./MiniGameApiBase"; import { GameCfg } from "../Config/GameCfg"; export interface OnloadCB { adId: string;//广告标识,用来上报曝光与点击 title: string;//广告标题 desc: string;//广告描述 icon: string;//推广应用的Icon图标 imgUrlList: any[];//广告图片 logoUrl: string;//广告标签图片 clickBtnTxt: string;//点击按钮文本描述 creativeType: number;//获取广告类型,取值说明:0:混合 interactionType: number;//获取广告点击之后的交互类型,取值说明: 1:网址类 2:应用下载类 8:快应用生态应用 } export interface VivoVideoAd { // 通过 load 方法主动预加载广告内容。 // 此外,在显示广告出现问题时也可以尝试主动 load 一次。 // 该方法返回一个 Promise,如果广告已经自动拉取成功,调用该方法返回一个 resolved Promise; load: () => Promise; // 广告创建后默认是隐藏的,可以通过该方法显示广告。 该方法返回一个 Promise 对象。当广告组件正常获取素材时,该 Promise 对象会是一个 resolved Promise。当广告组件发生错误时,会是一个 rejected Promise,参数与error事件监听器获得的参数相同。 show: () => Promise; //绑定 load 事件的监听器,用户在手动调用 load 方法后,广告组件会预先加载。 广告组件成功拉取广告素材时会触发load事件的监听器。 //确保监听此事件时,开发者主动调用过 load 方法。 onLoad: (listener: Function) => void; // 解除绑定 load 事件的监听器。 offLoad: (listener: Function) => void; //绑定 error 事件的监听器。 广告组件拉取广告素材和其他情况下如果发生错误,会触发error事件的监听器。监听器会获得一个包含errCode和errMsg属性的对象参数。 // errCode 详情 onError: (listener: (error: any) => void) => void; // 解除绑定 error 事件的监听器。 offError: (listener: Function) => void; // 绑定 close 事件的监听器。 当用户点击了 Video 广告上的关闭按钮时,会触发close事件的监听器。监听器会获得一个包含isEnded属性的对象参数,表征用户是否完整观看了视频。 onClose: (listener: (res: { isEnded: boolean }) => void) => void; //解除绑定 close 事件的监听器。 offClose: (listener: Function) => void; // destroy(); } const vivo: any = window['qg']; export default class VivoApi extends MiniGameApiBase { checkScene(successCB?: Function, errorCB?: Function) { throw new Error("Method not implemented."); } navigateToScene(successCB?: Function, errorCB?: Function) { throw new Error("Method not implemented."); } getStorageSync(key?: string) { throw new Error("Method not implemented."); } removeStorage(key?: string) { throw new Error("Method not implemented."); } getDeviceInfo() { throw new Error("Method not implemented."); } setUnlockAllTime(time: number) { throw new Error("Method not implemented."); } getUnlockAllTime(call: Function) { throw new Error("Method not implemented."); } setUnitState(state?: string) { throw new Error("Method not implemented."); } reportAnalytics(eventName: string, data?: { [key: string]: string | number | boolean; }) { throw new Error("Method not implemented."); } setSoundInfo(sound?: boolean, music?: boolean) { throw new Error("Method not implemented."); } protected m_AppId: string = ""; protected m_Secret: string = ""; protected m_VideoAdIdIndex: number = 0; protected m_VideoAdIdList: string[] = []; protected m_BannerAdIdIndex: number = 0; protected m_BannerAdId: string[] = []; protected m_InsertAdIdIndex: number = 0; protected m_InsertAdId: string[] = []; protected m_videoAd: VivoVideoAd = undefined; protected m_BannerAd: any = undefined; validAppId(): void { console.log("vivo-api-validAppId"); } ready(): void { if (GameCfg.SYSTEM_LOG) console.log("vivo-api-ready"); } getUserInfo(params: getUserInfoParams): void { vivo.getUserInfo(params); } showToast(params: toastParams): void { vivo.showToast(params); } showLoading(params: loadParams): void { vivo.showLoading(params); } hideLoading(): void { vivo.hideLoading(); } showModal(params: ModalParams): void { } authorize(params: authorizeParams): void { params.success && params.success(); } login(params: loginParams): void { vivo.login(params); } getVideoAdId(): string { const id: string = this.m_VideoAdIdList[this.m_VideoAdIdIndex]; this.m_VideoAdIdIndex++; if (this.m_VideoAdIdIndex >= this.m_VideoAdIdList.length) { this.m_VideoAdIdIndex = 0; } return id; } loadAndShowVideoAd(successCB: () => void, errorCB: (error: any) => void, completeCB?: () => void, reportAnalyticsExplain?: string): void { if (this.m_videoAd == null) { this.m_videoAd = vivo.createRewardedVideoAd({ adUnitId: this.getVideoAdId() }); } let onClose = (res) => { if (res && res.isEnded) { // 给予奖励 successCB(); // O1HD.getManagers().soundMgr.setSoundEnabled(true); } else { // errorCB('视频中途退出'); // O1HD.getManagers().soundMgr.setSoundEnabled(true); } this.m_videoAd.offClose(onClose); completeCB && completeCB(); }; // this.m_videoAd.load().then(() => { //加载视频广告完成 this.m_videoAd.show().then(() => { //播放视频广告完成 this.m_videoAd.onClose(onClose); // O1HD.getManagers().soundMgr.setSoundEnabled(true); // O1HD.getManagers().soundMgr.playMusic("BGM1"); }).catch((err) => { //播放视频广告错误 errorCB('视频显示错误 :' + JSON.stringify(err)); this.m_videoAd.offClose(onClose); completeCB && completeCB(); }) }).catch((err) => { //加载视频广告错误 errorCB('视频加载错误 :' + JSON.stringify(err)); this.m_videoAd.offClose(onClose); completeCB && completeCB(); }); } getInsertAdId(): string { const id: string = this.m_InsertAdId[this.m_InsertAdIdIndex]; this.m_InsertAdIdIndex++; if (this.m_InsertAdIdIndex >= this.m_InsertAdId.length) { this.m_InsertAdIdIndex = 0; } return id; } showInsertAd(onAdClose: () => void, onFailed: () => void): void { console.log("加抖音 插屏 广告"); const adId = this.getInsertAdId(); let insertAd = vivo.createInterstitialAd({ adUnitId: adId, }); insertAd.load(); insertAd.onLoad(() => { console.warn('插屏广告 加载完成'); insertAd.show().catch((err) => { console.warn('插屏广告 显示失败 :' + JSON.stringify(err)); insertAd.destroy(); insertAd = null; if (onFailed) { onFailed(); } }); }); insertAd.onError((err) => { console.warn('插屏广告 加载失败' + JSON.stringify(err)); insertAd.destroy(); insertAd = null; if (onFailed) { onFailed(); } }); insertAd.onClose(() => { console.warn('插屏广告 关闭'); if (insertAd != null) { insertAd.destroy(); insertAd = null; } if (onAdClose) { onAdClose(); } }); } protected bannerSuccese: boolean = false; getBannerAdId(): string { const id: string = this.m_BannerAdId[this.m_BannerAdIdIndex]; this.m_BannerAdIdIndex++; if (this.m_BannerAdIdIndex >= this.m_BannerAdId.length) { this.m_BannerAdIdIndex = 0; } return id; } showBannerAD(node: Node, successCB?: () => void, errorCB?: (error: any) => void, onCloseCB?: () => void, setBannerPos?: ({ screenWidth, screenHeight }: { screenWidth: any; screenHeight: any; }) => Vec2): void { const { screenWidth, screenHeight } = vivo.getSystemInfoSync(); let pos: Vec2 = setBannerPos && setBannerPos({ screenWidth, screenHeight }) || new Vec2(0, 0); // var targetBannerAdWidth = 200; if (this.m_BannerAd && !this.bannerSuccese) { this.m_BannerAd.destroy() this.m_BannerAd = null } if (this.m_BannerAd) { this.m_BannerAd.show() .then(() => { successCB && successCB(); console.log("---------------------Banner广告直接显示成功"); }) .catch((err) => { errorCB && errorCB(err); console.log("---------------------Banner广告直接显示组件出现问题", JSON.stringify(err)); }); return } this.bannerSuccese = true; if (this.m_BannerAd == null) { this.m_BannerAd = vivo.createBannerAd({ posId: this.getBannerAdId(), adIntervals: 30, style: { // width: targetBannerAdWidth, // top: screenHeight - (targetBannerAdWidth / 16) * 9, // 根据系统约定尺寸计算出广告高度 left: pos.x, top: pos.y, }, });//创建 } this.m_BannerAd.onSize(size => { console.log(size.width, size.height, "------------banner长宽-----------"); // this.m_BannerAd.style.top = size.height;//screenHeight - size.height; // this.m_BannerAd.style.left = size.width;//(screenWidth - size.width) / 2; // setBannerPosition && setBannerPosition({ x: this.m_BannerAd.style.left, y: this.m_BannerAd.style.top }, // { width: size.width, height: size.height }); }); this.m_BannerAd.onLoad(() => { if (node == null || !node.active || !node.isValid) { console.log("---------------------------------------------------------"); return } this.bannerSuccese = false; this.m_BannerAd .show() .then(() => { successCB && successCB(); console.log("---------------------Banner广告显示成功"); this.m_BannerAd.onClose(() => { onCloseCB && onCloseCB(); }); }) .catch((err) => { errorCB && errorCB(err); console.log("---------------------Banner广告组件显示出现问题" + err.errCode + " :" + err.errMsg); }); }); this.m_BannerAd.onError((err) => { this.bannerSuccese = false; errorCB && errorCB(err); console.log("---------------------Banner广告加载错误,错误原因:" + err.errCode + " :" + err.errMsg); }); } hideBanner() { // if (this.m_BannerAd != null) { // this.m_BannerAd.hide(); // } } recordedGameScreenStart(params: recordedGameScreenParams, onStart?: (res: any) => void): void { console.log("vivo-api-recordedGameScreenStart"); onStart && onStart(null); } recordedGameScreenStop() { console.log("vivo-api-recordedGameScreenStop"); return true; } shareRecordedGameScreen(successCb?: () => void, failCb?: (e?: any) => void): void { console.log("vivo-api-shareRecordedGameScreen"); successCb && successCb(); } isHaveRecordedGameScreen(): boolean { return true; } }