Ch_task.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. onGetReward: (itemId: Array<{ itemId: number, num: number }>) => void;
  7. onViedoReward: (success: boolean) => void;
  8. onSaveGameData: (save_data: TaskObj) => void;
  9. onJumpGameLevel: (callBack: Function) => void;
  10. onShareGame: (callBack: Function) => void;
  11. onUpdatePreTask: (count: number) => void;
  12. onJump: (type: TaskType) => void;
  13. }
  14. /**任务类型 */
  15. export enum TaskType {
  16. ITEM, //看视频直接领取
  17. LEVEL,//完成关卡直接领取
  18. SHARE,// 分享直接领取
  19. VIDEO, //看视频领取奖励
  20. JIGSAW, // 完成拼图
  21. }
  22. export class TaskObj {
  23. taskIds: Array<number>; //完成任务领取id
  24. preTaskIds: Array<number>; //完成任务未领取id
  25. taskTypeData: { [key: number]: { taskType: number, count: number } }; //任务类型数据
  26. curTimetatmp: number; //当前时间戳
  27. }
  28. /** 主窗口 */
  29. const mainPopup = "Task/Prefab/Popup/taskPopup";
  30. /** 包名 */
  31. const bundleName = "Task";
  32. /** 定义一个类 */
  33. class Ch_task {
  34. /** 私有构造函数 */
  35. private constructor() { }
  36. /** 单例模式 */
  37. public static readonly instance: Ch_task = new Ch_task();
  38. private _firstParent: Node | null = null;
  39. private _secondParent: Node | null = null;
  40. private _taskCfg: { [key: number]: { id: number, type: number, value: number } } = null;
  41. private _data: TaskObj = {
  42. taskIds: [],
  43. preTaskIds: [],
  44. taskTypeData: {},
  45. curTimetatmp: 0
  46. };
  47. private _evt = chsdk.get_new_event<evt>();
  48. get evt() {
  49. return this._evt;
  50. }
  51. /**
  52. * 初始化数据
  53. * @param data
  54. */
  55. init(data: TaskObj) {
  56. // 初始化
  57. this._data = data ? data : this._data;
  58. }
  59. /**
  60. * 初始配置
  61. * @param data
  62. */
  63. initTaskCfg(data: { [key: number]: { id: number, type: number, value: number } }) {
  64. if (!this._taskCfg || JSON.stringify(this._taskCfg) != JSON.stringify(data)) {
  65. this._taskCfg = data;
  66. }
  67. }
  68. /** 公共点击事件 */
  69. onComClick() {
  70. this.evt.emit(this.evt.key.onComClick);
  71. }
  72. /**
  73. * 获得奖励
  74. * @param itemId
  75. */
  76. onGetReward(items: Array<{ itemId: number, num: number }>) {
  77. this.evt.emit(this.evt.key.onGetReward, items);
  78. }
  79. /**
  80. * 看视频广告
  81. */
  82. onViedoReward(success: boolean) {
  83. this.evt.emit(this.evt.key.onViedoReward, success);
  84. }
  85. /**
  86. * 跳到游戏关卡
  87. */
  88. onJumpGameLevel() {
  89. this.evt.emit(this.evt.key.onJumpGameLevel, (isFinish: boolean) => {
  90. if (isFinish) {
  91. //更新任务数据
  92. this.updateTaskTypeData(TaskType.LEVEL);
  93. this.onSaveGameData();
  94. this.onUpdatePreTask();
  95. }
  96. });
  97. }
  98. onJump(type: TaskType) {
  99. this.evt.emit(this.evt.key.onJump, type);
  100. }
  101. /**
  102. * 分享游戏
  103. */
  104. onShareGame(cb?: Function) {
  105. this.evt.emit(this.evt.key.onShareGame, (isSuccess: boolean) => {
  106. if (isSuccess) {
  107. //更新任务数据
  108. if (cb) {
  109. cb();
  110. //this.updateTaskTypeData(TaskType.SHARE, 1);
  111. //this.onSaveGameData();
  112. //this.onUpdatePreTask();
  113. }
  114. }
  115. });
  116. }
  117. /**
  118. * 更新任务类型数据
  119. * @param type 任务类型
  120. * @param count
  121. */
  122. updateTaskTypeData(type: number, count: number = 1) {
  123. let taskTypeData = this._data.taskTypeData[type];
  124. if (taskTypeData) {
  125. taskTypeData.count += count;
  126. } else {
  127. this._data.taskTypeData[type] = { taskType: type, count: count };
  128. }
  129. //更新待领取任务
  130. this.updatePreTaksIds(this._data.taskTypeData[type].taskType, this._data.taskTypeData[type].count);
  131. }
  132. /**
  133. * 更新待领取的奖励id
  134. * @param itemId
  135. */
  136. private updatePreTaksIds(type: number, count: number) {
  137. for (let key in this._taskCfg) {
  138. let item = this._taskCfg[key];
  139. if (item.type == type && item.value <= count) {
  140. if (this._data.preTaskIds.indexOf(item.id) == -1) {
  141. this._data.preTaskIds.push(item.id);
  142. }
  143. }
  144. }
  145. }
  146. /**
  147. * 更新待领取的任务id
  148. */
  149. onUpdatePreTask() {
  150. this.evt.emit(this.evt.key.onUpdatePreTask, this._data.preTaskIds.length);
  151. }
  152. /**
  153. * 保存游戏数据
  154. */
  155. onSaveGameData() {
  156. this.evt.emit(this.evt.key.onSaveGameData, this._data);
  157. }
  158. /**
  159. * 获取内部父节点
  160. * @returns
  161. */
  162. getInterParent() {
  163. return this._secondParent;
  164. }
  165. /**
  166. * 获取游戏数据
  167. */
  168. getGameData() {
  169. return this._data;
  170. }
  171. /**
  172. * 清空数据
  173. */
  174. protected clear() {
  175. this._data = {
  176. taskIds: [],
  177. preTaskIds: [],
  178. taskTypeData: {},
  179. curTimetatmp: 0
  180. };
  181. }
  182. /**
  183. * 加载分包
  184. * @param preogerss
  185. * @param onComplete
  186. */
  187. loadBundle(preogerss?: (progress: number) => void, onComplete?: (err: Error | null, bundle: AssetManager.Bundle | null) => void): void {
  188. const onProgress = (progress: number) => {
  189. chsdk.log.debug(`加载进度:${progress}%`);
  190. if (preogerss) {
  191. preogerss(progress);
  192. }
  193. };
  194. bundleMgr.getBundle(bundleName, onProgress)
  195. .then((bundle) => {
  196. if (bundle) {
  197. chsdk.log.debug('分包加载成功!');
  198. // 在这里可以执行加载完成后的操作
  199. if (onComplete) {
  200. onComplete(null, bundle);
  201. }
  202. } else {
  203. chsdk.log.debug('分包加载失败!');
  204. // 这里可以执行失败后的操作
  205. setTimeout(() => {
  206. // 这里可以尝试重新加载分包
  207. this.loadBundle(preogerss, onComplete);
  208. }, 1000);
  209. }
  210. })
  211. }
  212. /**
  213. * 显示主窗口
  214. * @param parent 父节点
  215. * @param interParent 界面父节点
  216. */
  217. show(parent?: Node, interParent?: Node) {
  218. this._firstParent = parent ? parent : null;
  219. this._secondParent = interParent ? interParent : null;
  220. resMgr.loadRes<Prefab>(mainPopup).then((prefab: Prefab) => {
  221. let node = instantiate(prefab);
  222. if (parent) {
  223. if (isValid(parent)) {
  224. node.parent = parent;
  225. } else {
  226. node.destroy();
  227. }
  228. }
  229. else {
  230. let canvas = director.getScene().getChildByName("Canvas");
  231. if (canvas) {
  232. node.parent = canvas;
  233. }
  234. }
  235. });
  236. }
  237. }
  238. /** 导出单例模式的实例 */
  239. export const ch_task: Ch_task = Ch_task.instance;