import { AssetManager, director, instantiate, Node, Prefab } from "cc"; import { bundleMgr } from "../Mgr/BundleMgr"; import { resMgr } from "../Mgr/ResMgr"; import { PassCfg } from "../Config/PassCfg"; import { ch } from "../../ch"; export interface evt { onComClick: () => void; onGetReward: (itemId: number, count: number) => void; onViedoReward: (success: boolean) => void; onSaveGameData: (save_data: PassObj) => void; } export interface PassObj { rewardId: Array<{ id: number, indexArr: Array }>; //领取的奖励数据 keyCount: number; // 钥匙数量 unlockLevel: number; //解锁等级 curTimetatmp: number; //当前时间戳 } /** 主窗口 */ const mainPopup = "Pass/passPopup"; /** 包名 */ const bundleName = "Pass"; /** 定义一个类 */ class Ch_pass { /** 私有构造函数 */ private constructor() { } /** 单例模式 */ public static readonly instance: Ch_pass = new Ch_pass(); private _firstParent: Node | null = null; private _secondParent: Node | null = null; private _data: PassObj = { rewardId: [], keyCount: 0, unlockLevel: 0, curTimetatmp: 0 }; private _evt = chsdk.get_new_event(); get evt() { return this._evt; } /** * 初始化数据 * @param data */ init(data: any) { // 初始化 this._data = data ? data : this._data; //是否初始化数据 let diffTime = this.getDiffTime(); if (diffTime <= 0) { this.clear(); this.onSaveGameData(); } } /** 公共点击事件 */ onComClick() { this.evt.emit(this.evt.key.onComClick); } /** * 获得奖励 * @param itemId */ onGetReward(itemId: number, count: number) { // console.log("获得奖励", itemId); this.evt.emit(this.evt.key.onGetReward, itemId, count); this.onSaveGameData(); } /** * 看视频广告 */ onViedoReward(success: boolean) { this.evt.emit(this.evt.key.onViedoReward, success); } /** * 保存游戏数据 * @param save_data */ onSaveGameData() { this.evt.emit(this.evt.key.onSaveGameData, this._data); } /** * 获取内部父节点 * @returns */ getInterParent() { return this._secondParent; } /** * 获取游戏数据 */ getGameData() { return this._data; } /** * 添加通行证钥匙 */ addPassKey(count: number = 1) { if (this._data.unlockLevel < this.getItemLength()) { this._data.keyCount += count; // 更新解锁等级 while (this._data.keyCount >= PassCfg.maxKeyCount) { this._data.keyCount -= PassCfg.maxKeyCount; this._data.unlockLevel++; } this.onSaveGameData(); } } /** * 检测是否有未领取的奖励 */ checkHasReward() { let pidArr = this.getUnlockPidArr(); let hasReward = false; for (let i = this._data.rewardId.length - 1; i >= 0; i--) { let reward = this._data.rewardId[i]; if (pidArr.indexOf(reward.id) != -1) { if (reward.indexArr.length == PassCfg.passItems[reward.id].reward.length) { pidArr.splice(pidArr.indexOf(reward.id), 1); } } } hasReward = pidArr.length > 0; return hasReward; } /** * 获取预领取奖励 */ getPreRewaedIs() { let pidArr = this.getUnlockPidArr(); for (let i = this._data.rewardId.length - 1; i >= 0; i--) { let reward = this._data.rewardId[i]; if (pidArr.indexOf(reward.id) != -1) { if (reward.indexArr.indexOf(1) != -1) { pidArr.splice(pidArr.indexOf(reward.id), 1); } } } return pidArr.length; } /** * 获取解锁的pidArr */ private getUnlockPidArr() { let pidArr = []; let items = PassCfg.passItems; let keys = Object.keys(items); for (let i = 0; i < keys.length; i++) { let key = keys[i]; let item = items[key]; if (i < this._data.unlockLevel) { pidArr.push(item.id); } } return pidArr; } /** * 获取奖励等级 */ private getItemLength() { let level = 0; let items = PassCfg.passItems; for (let key in items) { level++; } return level; } /** * 获取当前时间差 * @returns 当前时间差 */ private getDiffTime(): number { const now = ch.date.getTime(); if (!ch.date.isSameDate(now, this._data.curTimetatmp)) { return 0; } let diffTime = ch.date.getDayEndTime(now) - now; return diffTime; } /** * 清空数据 */ clear() { this._data.curTimetatmp = ch.date.getTime(); this._data.keyCount = 0; this._data.unlockLevel = 0; this._data.rewardId = []; } /** * 加载分包 * @param preogerss * @param onComplete */ loadBundle(preogerss?: (progress: number) => void, onComplete?: (err: Error | null, bundle: AssetManager.Bundle | null) => void): void { const onProgress = (progress: number) => { chsdk.log.debug(`加载进度:${progress}%`); if (preogerss) { preogerss(progress); } }; bundleMgr.getBundle(bundleName, onProgress) .then((bundle) => { if (bundle) { chsdk.log.debug('分包加载成功!'); // 在这里可以执行加载完成后的操作 if (onComplete) { onComplete(null, bundle); } } else { chsdk.log.debug('分包加载失败!'); // 这里可以执行失败后的操作 setTimeout(() => { // 这里可以尝试重新加载分包 this.loadBundle(preogerss, onComplete); }, 1000); } }) } /** * 显示主窗口 * @param parent 父节点 * @param interParent 界面父节点 */ show(parent?: Node, interParent?: Node) { this._firstParent = parent ? parent : null; this._secondParent = interParent ? interParent : null; resMgr.loadRes(mainPopup).then((prefab: Prefab) => { let node = instantiate(prefab); if (parent) { node.parent = parent; } else { let canvas = director.getScene().getChildByName("Canvas"); if (canvas) { node.parent = canvas; } } }); } hide() { this._firstParent.removeAllChildren(); this._secondParent.removeAllChildren(); } } /** 导出单例模式的实例 */ export const ch_pass: Ch_pass = Ch_pass.instance;