Ch_pass.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import { AssetManager, director, instantiate, Node, Prefab } from "cc";
  2. import { bundleMgr } from "../Mgr/BundleMgr";
  3. import { resMgr } from "../Mgr/ResMgr";
  4. import { PassCfg } from "../Config/PassCfg";
  5. import { ch } from "../../ch";
  6. export interface evt {
  7. onComClick: () => void;
  8. onGetReward: (itemId: number, count: number) => void;
  9. onViedoReward: (success: boolean) => void;
  10. onSaveGameData: (save_data: PassObj) => void;
  11. }
  12. export interface PassObj {
  13. rewardId: Array<{ id: number, indexArr: Array<number> }>; //领取的奖励数据
  14. keyCount: number; // 钥匙数量
  15. unlockLevel: number; //解锁等级
  16. curTimetatmp: number; //当前时间戳
  17. }
  18. /** 主窗口 */
  19. const mainPopup = "Pass/passPopup";
  20. /** 包名 */
  21. const bundleName = "Pass";
  22. /** 定义一个类 */
  23. class Ch_pass {
  24. /** 私有构造函数 */
  25. private constructor() { }
  26. /** 单例模式 */
  27. public static readonly instance: Ch_pass = new Ch_pass();
  28. private _firstParent: Node | null = null;
  29. private _secondParent: Node | null = null;
  30. private _data: PassObj = {
  31. rewardId: [],
  32. keyCount: 0,
  33. unlockLevel: 0,
  34. curTimetatmp: 0
  35. };
  36. private _evt = chsdk.get_new_event<evt>();
  37. get evt() {
  38. return this._evt;
  39. }
  40. /**
  41. * 初始化数据
  42. * @param data
  43. */
  44. init(data: any) {
  45. // 初始化
  46. this._data = data ? data : this._data;
  47. //是否初始化数据
  48. let diffTime = this.getDiffTime();
  49. if (diffTime <= 0) {
  50. this.clear();
  51. this.onSaveGameData();
  52. }
  53. }
  54. /** 公共点击事件 */
  55. onComClick() {
  56. this.evt.emit(this.evt.key.onComClick);
  57. }
  58. /**
  59. * 获得奖励
  60. * @param itemId
  61. */
  62. onGetReward(itemId: number, count: number) {
  63. // console.log("获得奖励", itemId);
  64. this.evt.emit(this.evt.key.onGetReward, itemId, count);
  65. this.onSaveGameData();
  66. }
  67. /**
  68. * 看视频广告
  69. */
  70. onViedoReward(success: boolean) {
  71. this.evt.emit(this.evt.key.onViedoReward, success);
  72. }
  73. /**
  74. * 保存游戏数据
  75. * @param save_data
  76. */
  77. onSaveGameData() {
  78. this.evt.emit(this.evt.key.onSaveGameData, this._data);
  79. }
  80. /**
  81. * 获取内部父节点
  82. * @returns
  83. */
  84. getInterParent() {
  85. return this._secondParent;
  86. }
  87. /**
  88. * 获取游戏数据
  89. */
  90. getGameData() {
  91. return this._data;
  92. }
  93. /**
  94. * 添加通行证钥匙
  95. */
  96. addPassKey(count: number = 1) {
  97. if (this._data.unlockLevel < this.getItemLength()) {
  98. this._data.keyCount += count;
  99. // 更新解锁等级
  100. while (this._data.keyCount >= PassCfg.maxKeyCount) {
  101. this._data.keyCount -= PassCfg.maxKeyCount;
  102. this._data.unlockLevel++;
  103. }
  104. this.onSaveGameData();
  105. }
  106. }
  107. /**
  108. * 检测是否有未领取的奖励
  109. */
  110. checkHasReward() {
  111. let pidArr = this.getUnlockPidArr();
  112. let hasReward = false;
  113. for (let i = this._data.rewardId.length - 1; i >= 0; i--) {
  114. let reward = this._data.rewardId[i];
  115. if (pidArr.indexOf(reward.id) != -1) {
  116. if (reward.indexArr.length == PassCfg.passItems[reward.id].reward.length) {
  117. pidArr.splice(pidArr.indexOf(reward.id), 1);
  118. }
  119. }
  120. }
  121. hasReward = pidArr.length > 0;
  122. return hasReward;
  123. }
  124. /**
  125. * 获取预领取奖励
  126. */
  127. getPreRewaedIs() {
  128. let pidArr = this.getUnlockPidArr();
  129. for (let i = this._data.rewardId.length - 1; i >= 0; i--) {
  130. let reward = this._data.rewardId[i];
  131. if (pidArr.indexOf(reward.id) != -1) {
  132. if (reward.indexArr.indexOf(1) != -1) {
  133. pidArr.splice(pidArr.indexOf(reward.id), 1);
  134. }
  135. }
  136. }
  137. return pidArr.length;
  138. }
  139. /**
  140. * 获取解锁的pidArr
  141. */
  142. private getUnlockPidArr() {
  143. let pidArr = [];
  144. let items = PassCfg.passItems;
  145. let keys = Object.keys(items);
  146. for (let i = 0; i < keys.length; i++) {
  147. let key = keys[i];
  148. let item = items[key];
  149. if (i < this._data.unlockLevel) {
  150. pidArr.push(item.id);
  151. }
  152. }
  153. return pidArr;
  154. }
  155. /**
  156. * 获取奖励等级
  157. */
  158. private getItemLength() {
  159. let level = 0;
  160. let items = PassCfg.passItems;
  161. for (let key in items) {
  162. level++;
  163. }
  164. return level;
  165. }
  166. /**
  167. * 获取当前时间差
  168. * @returns 当前时间差
  169. */
  170. private getDiffTime(): number {
  171. const now = ch.date.getTime();
  172. if (!ch.date.isSameDate(now, this._data.curTimetatmp)) {
  173. return 0;
  174. }
  175. let diffTime = ch.date.getDayEndTime(now) - now;
  176. return diffTime;
  177. }
  178. /**
  179. * 清空数据
  180. */
  181. clear() {
  182. this._data.curTimetatmp = ch.date.getTime();
  183. this._data.keyCount = 0;
  184. this._data.unlockLevel = 0;
  185. this._data.rewardId = [];
  186. }
  187. /**
  188. * 加载分包
  189. * @param preogerss
  190. * @param onComplete
  191. */
  192. loadBundle(preogerss?: (progress: number) => void, onComplete?: (err: Error | null, bundle: AssetManager.Bundle | null) => void): void {
  193. const onProgress = (progress: number) => {
  194. chsdk.log.debug(`加载进度:${progress}%`);
  195. if (preogerss) {
  196. preogerss(progress);
  197. }
  198. };
  199. bundleMgr.getBundle(bundleName, onProgress)
  200. .then((bundle) => {
  201. if (bundle) {
  202. chsdk.log.debug('分包加载成功!');
  203. // 在这里可以执行加载完成后的操作
  204. if (onComplete) {
  205. onComplete(null, bundle);
  206. }
  207. } else {
  208. chsdk.log.debug('分包加载失败!');
  209. // 这里可以执行失败后的操作
  210. setTimeout(() => {
  211. // 这里可以尝试重新加载分包
  212. this.loadBundle(preogerss, onComplete);
  213. }, 1000);
  214. }
  215. })
  216. }
  217. /**
  218. * 显示主窗口
  219. * @param parent 父节点
  220. * @param interParent 界面父节点
  221. */
  222. show(parent?: Node, interParent?: Node) {
  223. this._firstParent = parent ? parent : null;
  224. this._secondParent = interParent ? interParent : null;
  225. resMgr.loadRes<Prefab>(mainPopup).then((prefab: Prefab) => {
  226. let node = instantiate(prefab);
  227. if (parent) {
  228. node.parent = parent;
  229. }
  230. else {
  231. let canvas = director.getScene().getChildByName("Canvas");
  232. if (canvas) {
  233. node.parent = canvas;
  234. }
  235. }
  236. });
  237. }
  238. hide() {
  239. this._firstParent.removeAllChildren();
  240. this._secondParent.removeAllChildren();
  241. }
  242. }
  243. /** 导出单例模式的实例 */
  244. export const ch_pass: Ch_pass = Ch_pass.instance;