Ch_jigsaw.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import { AssetManager, director, instantiate, isValid, Node, Prefab } from "cc";
  2. import { bundleMgr } from "../Mgr/BundleMgr";
  3. import { resMgr } from "../Mgr/ResMgr";
  4. export interface evt {
  5. onComClick: () => void;
  6. onCloseGame: () => void;
  7. onGetReward: (itemId: number, count: number) => void;
  8. onViedoReward: (success: boolean) => void;
  9. onSaveGameData: (save_data: JigsawObj) => void;
  10. }
  11. export interface JigsawObj {
  12. /** 放置拼图数据 */
  13. jigsawData: { [key: number]: Array<[number, number]> };
  14. /** 拥有的碎片数据 */
  15. cardData: { [key: number]: Array<number> };
  16. /** 拥有道具数据 */
  17. itemsData: { [key: number]: number };
  18. /** 完成领取拼图奖励数据 */
  19. rewardImgData: Array<number>;
  20. /** 解锁索引位置点 */
  21. unlockIndex: number;
  22. /** 添加的碎片数量 */
  23. addCardCount: number;
  24. }
  25. /** 主窗口 */
  26. const mainPopup = "Jigsaw/Prefab/Popup/jigsawListPopup";
  27. /** 包名 */
  28. const bundleName = "Jigsaw";
  29. /** 定义一个类 */
  30. class Ch_jigsaw {
  31. /** 私有构造函数 */
  32. private constructor() { }
  33. /** 单例模式 */
  34. public static readonly instance: Ch_jigsaw = new Ch_jigsaw();
  35. private _firstParent: Node | null = null;
  36. private _secondParent: Node | null = null;
  37. private _data: JigsawObj = {
  38. /** 放置拼图数据 */
  39. jigsawData: {},
  40. /** 拥有的碎片数据 */
  41. cardData: {},
  42. /** 拥有道具数据 */
  43. itemsData: {},
  44. /** 完成领取拼图奖励数据 */
  45. rewardImgData: [],
  46. /** 解锁索引位置点 */
  47. unlockIndex: 0,
  48. /** 添加的碎片数量 */
  49. addCardCount: 0
  50. };
  51. private _evt = chsdk.get_new_event<evt>();
  52. get evt() {
  53. return this._evt;
  54. }
  55. /**
  56. * 初始化数据
  57. * @param data
  58. */
  59. init(data: JigsawObj) {
  60. // 初始化
  61. this._data = data ? data : this._data;
  62. }
  63. /** 公共点击事件 */
  64. onComClick() {
  65. this.evt.emit(this.evt.key.onComClick);
  66. }
  67. /**
  68. * 获得奖励
  69. * @param itemId
  70. */
  71. onGetReward(itemId: number, count: number) {
  72. // console.log("获得奖励", itemId);
  73. this.evt.emit(this.evt.key.onGetReward, itemId, count);
  74. }
  75. /**
  76. * 看视频广告
  77. */
  78. onViedoReward(success: boolean) {
  79. this.evt.emit(this.evt.key.onViedoReward, success);
  80. }
  81. /**
  82. * 保存游戏数据
  83. * @param save_data
  84. */
  85. onSaveGameData(save_data: JigsawObj) {
  86. this._data = save_data;
  87. this.evt.emit(this.evt.key.onSaveGameData, save_data);
  88. }
  89. /**
  90. * 添加碎片
  91. * @param count
  92. */
  93. onAddCard(count: number) {
  94. this._data.addCardCount += count;
  95. this.evt.emit(this.evt.key.onSaveGameData, this._data);
  96. }
  97. /**
  98. * 获取未使用的碎片数量
  99. */
  100. getNoUseCardCount() {
  101. let count = this._data.addCardCount;
  102. let cardData = this._data.cardData;
  103. let placeData = this._data.jigsawData;
  104. for (let key in placeData) {
  105. if (placeData.hasOwnProperty(key)) {
  106. let arr = placeData[key];
  107. for (let i = 0; i < arr.length; i++) {
  108. let [x, y] = arr[i];
  109. if (x != y) {
  110. count++;
  111. }
  112. }
  113. }
  114. }
  115. for (let key in cardData) {
  116. if (cardData.hasOwnProperty(key)) {
  117. let arr = cardData[key];
  118. count += arr.length;
  119. }
  120. }
  121. return count;
  122. }
  123. /**
  124. * 获取游戏数据
  125. */
  126. getGameData() {
  127. return this._data;
  128. }
  129. /**
  130. * 获取父节点
  131. * @returns
  132. */
  133. getInterParent() {
  134. return this._secondParent;
  135. }
  136. /**
  137. * 加载分包
  138. * @param preogerss
  139. * @param onComplete
  140. */
  141. loadBundle(preogerss?: (progress: number) => void, onComplete?: (err: Error | null, bundle: AssetManager.Bundle | null) => void): void {
  142. const onProgress = (progress: number) => {
  143. chsdk.log.debug(`加载进度:${progress}%`);
  144. if (preogerss) {
  145. preogerss(progress);
  146. }
  147. };
  148. bundleMgr.getBundle(bundleName, onProgress)
  149. .then((bundle) => {
  150. if (bundle) {
  151. chsdk.log.debug('分包加载成功!');
  152. // 在这里可以执行加载完成后的操作
  153. if (onComplete) {
  154. onComplete(null, bundle);
  155. }
  156. } else {
  157. chsdk.log.debug('分包加载失败!');
  158. // 这里可以执行失败后的操作
  159. setTimeout(() => {
  160. // 这里可以尝试重新加载分包
  161. this.loadBundle(preogerss, onComplete);
  162. }, 1000);
  163. }
  164. })
  165. }
  166. /**
  167. * 显示主窗口
  168. * @param parent 父节点
  169. * @param interParent 界面父节点
  170. */
  171. show(parent?: Node, interParent?: Node) {
  172. this._firstParent = parent ? parent : null;
  173. this._secondParent = interParent ? interParent : null;
  174. resMgr.loadRes<Prefab>(mainPopup).then((prefab: Prefab) => {
  175. let node = instantiate(prefab);
  176. if (parent) {
  177. if (isValid(parent)) {
  178. node.parent = parent;
  179. } else {
  180. node.destroy();
  181. }
  182. }
  183. else {
  184. let canvas = director.getScene().getChildByName("Canvas");
  185. if (canvas) {
  186. node.parent = canvas;
  187. }
  188. }
  189. });
  190. }
  191. }
  192. /** 导出单例模式的实例 */
  193. export const ch_jigsaw: Ch_jigsaw = Ch_jigsaw.instance;