import { VideoPlayer, Node, director, Component, isValid } from "cc"; import HttpUnit from "../Common/HttpUnit"; import { SDKManager } from "./SDKManager"; import { SceneBgVideoLayer } from "../../Sub/UI/SceneBgVideoLayer"; import { BgVideo } from "./BgVideo"; import Utils from "../Common/Utils"; import { InnerMsgCode } from "../Config/InnerMsgCode"; import { VideoRoleType } from "../Common/GlobalValue"; import { logger } from "db://assets/Scripts/Main/Common/Logger"; export class WebSDK { //初始化 init(cb: Function = null) { logger.log("init webSDK"); cb && cb(); } //检查权限 checkAutoSetting(autoKey: string, cb: Function = null) { cb && cb(true); } //获取用户信息 getUserInfo(cb: Function = null) { let name = HttpUnit.GetNickName(); cb && cb({ nickName: name, avatarUrl: "https://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/webHead.png", }); } //region 登录 login(cb: Function = null) { cb && cb({ platform: 2, code: null }); } //显示视频广告 show_video(callback: Function, tag: number) { callback && callback({ code: 0, tag: tag }); SDKManager.video_ad_back(); } //显示插屏 show_splash() {} //显示Banner show_banner(...args) {} //隐藏Banner hide_banner(...args) {} //主动拉起分享 show_share(rewardCB?: Function) { rewardCB && rewardCB(); } //获取设备分辨率 getWindowSize() { return { width: screen.width, height: screen.height }; } //显示游戏圈 show_gameClub(leftRatio, topRatio, widthRatio, heightRatio) {} //隐藏游戏圈 hide_gameClub() {} //检查是否支持base64音频播放 checkSupportBase64Audio() { return true; } //播放base64音频 private _audioInst: HTMLAudioElement = null; playBase64Audio(base64: string, loop: boolean) { let substring = base64; let qianzhui = "data:audio/x-wav;base64,"; if (base64.startsWith(qianzhui)) { substring = base64.substring(qianzhui.length, base64.length); } // 解码 Base64 字符串为二进制数据 const binaryData = atob(substring); // 创建一个包含二进制数据的 Uint8Array const byteArray = new Uint8Array(binaryData.length); for (let i = 0; i < binaryData.length; i++) { byteArray[i] = binaryData.charCodeAt(i); } // 创建 Blob 对象,指定 MIME 类型为音频格式(例如 mp3) const audioBlob = new Blob([byteArray], { type: "audio/mp3" }); // 创建音频 URL const audioUrl = URL.createObjectURL(audioBlob); logger.log("web 播放base64音频", audioUrl); // 创建音频元素并播放 if (this._audioInst == null) { this._audioInst = new Audio(audioUrl); } else { this._audioInst.src = audioUrl; } this._audioInst.play(); } //客服功能是否支持 kefuSupport() { logger.log("web 不支持联系客服"); return false; } //进入联系客服 openKefu() { logger.log("web 进入联系客服"); } //region 播放主背景视频 private zhuVideo1: BgVideo | null = null; private zhuExtra1: any = null; playBgAudio( remoteUrl: string, vtype: VideoRoleType, loop: boolean = false, extra: any = {} ) { let bgvideo = SceneBgVideoLayer.handle; if (!bgvideo) { return; } this.initBgAudio(); if (this.zhuVideo1 && this.zhuVideo1.isPlaying) { this.playBgAudioNext(remoteUrl, vtype, loop, extra); return; } if (!this.zhuVideo1) { this.zhuVideo1 = bgvideo.getVideoClone(); } this.zhuExtra1 = extra; this.zhuVideo1.vtype = vtype; this.zhuVideo1.cbReady = this.audioReady.bind(this); this.zhuVideo1.cbEnd = this.audioEnded.bind(this); this.zhuVideo1.playVideo(remoteUrl, loop, false); } initBgAudio() { let bgvideo = SceneBgVideoLayer.handle; if (!bgvideo) { return; } logger.log("web 初始化主背景视频"); if (!this.zhuVideo1) { this.zhuVideo1 = bgvideo.getVideoClone(); this.zhuVideo1.remoteUrl = "http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4"; } if (!this.zhuVideo2) { this.zhuVideo2 = bgvideo.getVideoClone(); this.zhuVideo2.remoteUrl = "http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4"; } if (!this.emoVideo1) { this.emoVideo1 = bgvideo.getVideoClone(); this.emoVideo1.remoteUrl = "http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4"; } if (!this.emoVideo2) { this.emoVideo2 = bgvideo.getVideoClone(); this.emoVideo2.remoteUrl = "http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4"; } } audioReady() { this.removeBgAudioNext(); this.zhuVideo1.moveIn(); Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, { compo: this.zhuVideo1, extra: this.zhuExtra1, }); } audioEnded() { Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, { compo: this.zhuVideo1, extra: this.zhuExtra1, }); } removeBgAudio() { if (this.zhuVideo1 && this.zhuVideo1.isPlaying) { this.zhuVideo1.recycleVideo(); } } //主背景临时视频 private zhuVideo2: BgVideo | null = null; private zhuExtra2: any = null; playBgAudioNext( remoteUrl: string, vtype: VideoRoleType, loop: boolean = false, extra: any = {} ) { let bgvideo = SceneBgVideoLayer.handle; if (!bgvideo) { return; } this.removeBgAudioNext(); if (!this.zhuVideo2) { this.zhuVideo2 = bgvideo.getVideoClone(); } this.zhuExtra2 = extra; this.zhuVideo2.vtype = vtype; this.zhuVideo2.cbReady = this.audioNextReady.bind(this); this.zhuVideo2.cbEnd = this.audioNextEnded.bind(this); this.zhuVideo2.playVideo(remoteUrl, loop, false); } audioNextReady() { this.removeBgAudio(); this.zhuVideo2.moveIn(); Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, { compo: this.zhuVideo2, extra: this.zhuExtra2, }); } audioNextEnded() { Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, { compo: this.zhuVideo2, extra: this.zhuExtra2, }); } removeBgAudioNext() { if (this.zhuVideo2 && this.zhuVideo2.isPlaying) { this.zhuVideo2.recycleVideo(); } } //region 播放emo视频 private emoVideo1: BgVideo | null = null; private emoExtra1: any = {}; addEmoAudio( remoteUrl: string, vtype: VideoRoleType, loop: boolean = false, extra: any = {} ) { let bgvideo = SceneBgVideoLayer.handle; if (!bgvideo) { return; } if (this.emoVideo1 && this.emoVideo1.isPlaying) { this.playEmoAudioNext(remoteUrl, vtype, loop, extra); return; // this.emoVideo1.recycleVideo(); } if (!this.emoVideo1 || !isValid(this.emoVideo1.node)) { this.emoVideo1 = bgvideo.getVideoClone(); } this.emoExtra1 = extra; this.emoVideo1.vtype = vtype; this.emoVideo1.cbReady = this.emoReady.bind(this); this.emoVideo1.cbEnd = this.emoEnded.bind(this); this.emoVideo1.playVideo(remoteUrl, loop, false); } emoReady() { this.removeEmoNextAudio(); Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, { compo: this.emoVideo1, extra: this.emoExtra1, }); } emoEnded() { Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, { compo: this.emoVideo1, extra: this.emoExtra1, }); } removeEmoAudio() { if (this.emoVideo1 && this.emoVideo1.isPlaying) { this.emoVideo1.recycleVideo(); } } // 播放emo临时视频 private emoVideo2: BgVideo | null = null; private emoExtra2: any = {}; playEmoAudioNext( remoteUrl: string, vtype: VideoRoleType, loop: boolean = false, extra: any = {} ) { let bgvideo = SceneBgVideoLayer.handle; if (!bgvideo) { return; } this.removeEmoNextAudio(); if (!this.emoVideo2) { this.emoVideo2 = bgvideo.getVideoClone(); } this.emoExtra2 = extra; this.emoVideo2.vtype = vtype; this.emoVideo2.cbReady = this.emoNextReady.bind(this); this.emoVideo2.cbEnd = this.emoNextEnded.bind(this); this.emoVideo2.playVideo(remoteUrl, loop, false); } emoNextReady() { this.removeEmoAudio(); Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, { compo: this.emoVideo2, extra: this.emoExtra2, }); } emoNextEnded() { Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, { compo: this.emoVideo2, extra: this.emoExtra2, }); } removeEmoNextAudio() { if (this.emoVideo2 && this.emoVideo2.isPlaying) { this.emoVideo2.recycleVideo(); } } //region 复制到剪贴板 /**复制文本到剪贴板 */ copyToClipboard(text: string, cb?: Function) { logger.log("web 复制到剪贴板:", text); if (navigator.clipboard && window.isSecureContext) { // 使用现代的 Clipboard API navigator.clipboard .writeText(text) .then(() => { logger.log("web 复制成功 (Clipboard API)"); cb && cb(true); }) .catch((err) => { logger.log("web 复制失败 (Clipboard API):", err); this.fallbackCopyToClipboard(text, cb); }); } else { // 使用兼容性方案 this.fallbackCopyToClipboard(text, cb); } } /**兼容性复制方案 */ private fallbackCopyToClipboard(text: string, cb?: Function) { const textArea = document.createElement("textarea"); textArea.value = text; // 避免滚动到底部 textArea.style.top = "0"; textArea.style.left = "0"; textArea.style.position = "fixed"; textArea.style.opacity = "0"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { const successful = document.execCommand("copy"); if (successful) { logger.log("web 复制成功 (fallback)"); cb && cb(true); } else { logger.log("web 复制失败 (fallback)"); cb && cb(false); } } catch (err) { logger.log("web 复制异常 (fallback):", err); cb && cb(false); } document.body.removeChild(textArea); } //region 友盟+ umaInit() {} //友盟统计是否开启 umaSwt() { return false; } //友盟事件统计 umaEvent(eventName: string, value: any = {}) {} }