gameManager.ts 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. import { _decorator, assetManager, AudioClip, Component, instantiate, Label, Node, Prefab, resources, SpriteFrame, sys } from 'cc';
  2. import { server_han_zi_zhao_bu_tong_data, server_mei_nv_zhao_xi_jie_data, server_play_info, server_play_list_data, server_shuang_tu_zhao_bu_tong_data, server_sys_info, server_user_info, unlock_levels, unlock_levels_item } from './data/server_play_list_data';
  3. import { config } from './config';
  4. import { ClientEvent } from './framework/clientEvent';
  5. import { http } from './http/http';
  6. import { StorageManager } from './framework/storageManager';
  7. import { tools } from './tools';
  8. import { AudioManager } from './framework/audioManager';
  9. const { ccclass, property } = _decorator;
  10. @ccclass('gameManager')
  11. export class gameManager extends Component {
  12. public static g_server_sys_info:server_sys_info = new server_sys_info();
  13. public static g_server_play_list_data:server_play_list_data = new server_play_list_data();
  14. // public static g_server_shuang_tu_zhao_bu_tong_data:server_shuang_tu_zhao_bu_tong_data = new server_shuang_tu_zhao_bu_tong_data();
  15. // public static g_server_han_zi_zhao_bu_tong_data:server_han_zi_zhao_bu_tong_data = new server_han_zi_zhao_bu_tong_data();
  16. // public static g_server_mei_nv_zhao_xi_jie_data:server_mei_nv_zhao_xi_jie_data = new server_mei_nv_zhao_xi_jie_data();
  17. private static uiLayer:Node = null;
  18. private static topLayer:Node = null;
  19. private static waitLayer:Node = null;
  20. public static userInfo:server_user_info = new server_user_info();
  21. public static uiViewList:Map<string,Node> = new Map();
  22. public static topViewList:Map<string,Node> = new Map();
  23. public static user_level_data:unlock_levels = new unlock_levels();
  24. public static PreloadingLevelImgNumber:number = 0;//执行预加载的数量
  25. public static cache:Map<string,Map<string,SpriteFrame>> = new Map();
  26. public static mp3_cache:Map<string,AudioClip> = new Map();
  27. public static test_user_list:string[] = [];
  28. public static _instance: gameManager;
  29. public static get instance () {
  30. if (this._instance) {
  31. return this._instance;
  32. }
  33. this._instance = new gameManager();
  34. return this._instance;
  35. }
  36. start() {
  37. }
  38. public static isTestUser(){
  39. for (let index = 0; index < gameManager.test_user_list.length; index++) {
  40. const element = gameManager.test_user_list[index];
  41. if(parseInt(element)==gameManager.userInfo.id){
  42. return true;
  43. }
  44. }
  45. return false;
  46. }
  47. public static init_test_user_list(list:string[]){
  48. gameManager.test_user_list = list;
  49. }
  50. public static init_unlock_levels(){
  51. for (let index = 0; index < gameManager.g_server_play_list_data.list.length; index++) {
  52. const element = gameManager.g_server_play_list_data.list[index];
  53. let item:unlock_levels_item = new unlock_levels_item;
  54. item.id = element.id;
  55. item.level = 1;
  56. if(item.id===config.PLAY_TYPE.YI_QI_ZHAO_CHA){
  57. item.is_lock_game_play = 1;
  58. }else{
  59. item.is_lock_game_play = 0;
  60. }
  61. gameManager.user_level_data.list[element.id] = item;
  62. }
  63. }
  64. public static isFinishAllLevel(categoryid:number):boolean{
  65. let item = gameManager.get_cur_level_by_categoryid(categoryid)
  66. if(item.level===gameManager.get_play_level_number(categoryid)){
  67. return true;
  68. }
  69. return false;
  70. }
  71. public static get_play_level_number(categoryid:number):number{
  72. let list = gameManager.g_server_play_list_data.list;
  73. let number = 0;
  74. for (let index = 0; index < list.length; index++) {
  75. if(categoryid===list[index].id){
  76. number = list[index].barrier_number;
  77. break;
  78. }
  79. }
  80. return number;
  81. }
  82. public static get_unlock_levels():string{
  83. if(gameManager.user_level_data.list.length>0){
  84. return JSON.stringify(gameManager.user_level_data.list);
  85. }
  86. return "";
  87. }
  88. public static set_unlock_levels(unlock_levels:string){
  89. gameManager.user_level_data.list = JSON.parse(unlock_levels);
  90. }
  91. public static set_unlock_levels_data(item:unlock_levels_item){
  92. gameManager.user_level_data.list[item.id] = item;
  93. }
  94. public static setWaitLayer(node:Node){
  95. gameManager.waitLayer = node;
  96. }
  97. public static sync_data(call_back){
  98. let form_Data = null;
  99. if(sys.platform==sys.Platform.BYTEDANCE_MINI_GAME){
  100. form_Data = {"coin": gameManager.userInfo.coin+"","unlock_levels": gameManager.get_unlock_levels()}
  101. }else{
  102. form_Data = new FormData();
  103. form_Data.append("coin", gameManager.userInfo.coin+"");
  104. form_Data.append("unlock_levels", gameManager.get_unlock_levels());
  105. }
  106. http.post(config.api_url.sync_data,form_Data,(_err,c_data)=>{
  107. if(!_err){
  108. let c__data = JSON.parse(c_data);
  109. console.log("c__data",c__data)
  110. if(c__data.code==config.MSG_CODE.SUCCESS){
  111. ClientEvent.dispatchEvent(config.EVENT_MSG.ON_CHANGE_COIN_NUMBER);
  112. call_back(true)
  113. }
  114. }else{
  115. if(_err==-1){
  116. call_back(false)
  117. }
  118. }
  119. })
  120. }
  121. public static get_user_coin():number{
  122. return gameManager.userInfo.coin;
  123. }
  124. public static add_coin(coin:number){
  125. gameManager.userInfo.coin+=coin;
  126. gameManager.sync_data((is_sync)=>{})
  127. }
  128. public static sub_coin(coin:number){
  129. gameManager.userInfo.coin-=coin;
  130. if( gameManager.userInfo.coin<0){
  131. gameManager.userInfo.coin = 0;
  132. }
  133. gameManager.sync_data((is_sync)=>{})
  134. }
  135. public static showLoading(){
  136. gameManager.hideLoading();
  137. gameManager.addTopView(config.PREFAB_PATH.view_loading,null);
  138. }
  139. public static hideLoading(){
  140. if(gameManager.topViewList.get(config.PREFAB_PATH.view_loading)){
  141. gameManager.topViewList.get(config.PREFAB_PATH.view_loading).removeFromParent();
  142. gameManager.topViewList.set(config.PREFAB_PATH.view_loading,null);
  143. }
  144. }
  145. public static get_cur_level_by_categoryid(categoryid:number):unlock_levels_item{
  146. if(gameManager.user_level_data.list.length<=0){
  147. return null;
  148. }
  149. switch (categoryid) {
  150. case config.PLAY_TYPE.YI_QI_ZHAO_CHA:
  151. return gameManager.user_level_data.list[config.PLAY_TYPE.YI_QI_ZHAO_CHA];
  152. case config.PLAY_TYPE.HAN_ZI_ZHAO_BU_TONG:
  153. return gameManager.user_level_data.list[config.PLAY_TYPE.HAN_ZI_ZHAO_BU_TONG];
  154. case config.PLAY_TYPE.MEI_NV_ZHAO_XI_JIE:
  155. return gameManager.user_level_data.list[config.PLAY_TYPE.MEI_NV_ZHAO_XI_JIE];
  156. }
  157. }
  158. public static next_level(categoryid:number,call_back):boolean{
  159. let item = gameManager.get_cur_level_by_categoryid(categoryid);
  160. let play_item = gameManager.get_play_list_item_by_categoryid(categoryid);
  161. if(item.level<=play_item.barrier_number){
  162. item.level+=1;
  163. gameManager.sync_data((is_sync)=>{
  164. if(is_sync){
  165. gameManager.set_unlock_levels_data(item);
  166. }else{
  167. item.level-=1;
  168. }
  169. call_back(is_sync)
  170. })
  171. return true;
  172. }
  173. return false;
  174. }
  175. public static setUiLayer(node:Node){
  176. gameManager.uiLayer = node;
  177. }
  178. public static getTopLayer():Node{
  179. return gameManager.topLayer;
  180. }
  181. public static setTopLayer(node:Node){
  182. gameManager.topLayer = node;
  183. }
  184. public static addUiView(parent_path:string,call_back){
  185. if(gameManager.uiLayer==null){
  186. console.log("gameManager.uiLayer -- null!");
  187. return;
  188. }
  189. gameManager.showWaitView();
  190. resources.load(parent_path, Prefab, (err, prefab) => {
  191. if(err){
  192. console.log("addUiView -- err::",err);
  193. return;
  194. }
  195. let newNode:Node = instantiate(prefab);
  196. newNode.parent = gameManager.uiLayer;
  197. gameManager.uiViewList.set(parent_path,newNode);
  198. gameManager.hideWaitView();
  199. if(call_back!=null){
  200. call_back(newNode);
  201. }
  202. });
  203. }
  204. public static addTopView(parent_path:string,call_back){
  205. if(gameManager.topLayer==null){
  206. console.log("gameManager.topLayer -- null!");
  207. return;
  208. }
  209. gameManager.showWaitView();
  210. resources.load(parent_path, Prefab, (err, prefab) => {
  211. if(err){
  212. console.log("addTopView -- err::",err);
  213. return;
  214. }
  215. let newNode:Node = instantiate(prefab);
  216. gameManager.topViewList.set(parent_path,newNode);
  217. newNode.parent = gameManager.topLayer;
  218. gameManager.hideWaitView();
  219. if(call_back!=null){
  220. call_back(newNode);
  221. }
  222. });
  223. }
  224. public static showWaitView(){
  225. gameManager.waitLayer.active = true;
  226. }
  227. public static hideWaitView(){
  228. gameManager.waitLayer.active = false;
  229. }
  230. public static set_server_user_data(data){
  231. gameManager.userInfo = data;
  232. if(gameManager.userInfo.unlock_levels!=""){
  233. gameManager.set_unlock_levels(gameManager.userInfo.unlock_levels);
  234. }
  235. console.log("set_server_user_data::",data);
  236. }
  237. public static set_server_play_list_data(data:server_play_info){
  238. gameManager.g_server_play_list_data.list = data.wf_list;
  239. gameManager.g_server_sys_info = data.sys_info;
  240. ClientEvent.dispatchEvent(config.EVENT_MSG.ON_INIT_GAME_LIST);
  241. console.log("set_server_play_list_data::",data);
  242. }
  243. public static get_play_list_item_by_categoryid(categoryid:number){
  244. for (let index = 0; index < gameManager.g_server_play_list_data.list.length; index++) {
  245. const element = gameManager.g_server_play_list_data.list[index];
  246. if(element.id===categoryid){
  247. return element;
  248. }
  249. }
  250. return null;
  251. }
  252. public static PreloadingLevelImg(finish_call_back){
  253. if(gameManager.g_server_play_list_data.list.length<=0){
  254. return
  255. }
  256. if(gameManager.PreloadingLevelImgNumber<=0){
  257. let count = 0;
  258. let call_back = ()=>{
  259. count++;
  260. if(count>=gameManager.PreloadingLevelImgNumber){
  261. gameManager.PreloadingLevelImgNumber = 0;
  262. finish_call_back()
  263. }
  264. }
  265. for (let index = 0; index < gameManager.g_server_play_list_data.list.length; index++) {
  266. const element = gameManager.g_server_play_list_data.list[index];
  267. let item = gameManager.get_cur_level_by_categoryid(element.id);
  268. if((item.level+1)<=element.barrier_number){
  269. let key = `${element.id}_${item.level+1}`;
  270. // let str = StorageManager.instance.getGlobalData(key);
  271. if(!gameManager.cache.get(`${item.level+1}_${element.id}`)){
  272. gameManager.PreloadingLevelImgNumber++;
  273. gameManager.loadLevelImg(element.id,item.level+1,call_back)
  274. }
  275. }
  276. }
  277. }
  278. }
  279. public static loadLevelImg(category_id,level,call_back){
  280. let key = `${category_id}_${level}`;
  281. let list:Map<string,SpriteFrame> = new Map()
  282. http.get(config.static_url.levels_info(category_id,level),(err,data)=>{
  283. if(!err){
  284. let _data = JSON.parse(data)
  285. if(_data.code===config.MSG_CODE.SUCCESS){
  286. let data = _data.content
  287. switch(category_id){
  288. case config.PLAY_TYPE.YI_QI_ZHAO_CHA:
  289. let img_count = 0;
  290. let img_call_back = ()=>{
  291. if(img_count>=2){
  292. console.log("key",key)
  293. StorageManager.instance.setGlobalData(key,"1")
  294. gameManager.cache.set(`${level}_${category_id}`,list)
  295. call_back();
  296. }
  297. }
  298. tools.loadRemoteImg(data.img1,(sf:SpriteFrame)=>{
  299. sf.addRef();
  300. list.set(data.img1,sf);
  301. img_count++;
  302. img_call_back();
  303. })
  304. tools.loadRemoteImg(data.img2,(sf)=>{
  305. sf.addRef();
  306. list.set(data.img2,sf);
  307. img_count++;
  308. img_call_back();
  309. })
  310. break;
  311. case config.PLAY_TYPE.HAN_ZI_ZHAO_BU_TONG:
  312. let img_count_font = 0;
  313. let img_call_back_font = ()=>{
  314. if(img_count_font>=3){
  315. console.log("key",key)
  316. gameManager.cache.set(`${level}_${category_id}`,list)
  317. StorageManager.instance.setGlobalData(key,"1")
  318. call_back();
  319. }
  320. }
  321. tools.loadRemoteImg(data.default_img,(sf)=>{
  322. sf.addRef();
  323. list.set(data.default_img,sf);
  324. img_count_font++;
  325. img_call_back_font();
  326. })
  327. tools.loadRemoteImg(data.find_img,(sf)=>{
  328. sf.addRef();
  329. list.set(data.find_img,sf);
  330. img_count_font++;
  331. img_call_back_font();
  332. })
  333. tools.loadRemoteImg(data.d_img,(sf)=>{
  334. sf.addRef();
  335. list.set(data.d_img,sf);
  336. img_count_font++;
  337. img_call_back_font();
  338. })
  339. break;
  340. case config.PLAY_TYPE.MEI_NV_ZHAO_XI_JIE:
  341. let img_count_component = 0;
  342. let img_call_back_component = ()=>{
  343. if(img_count_component>=data.component.length+1){
  344. console.log("key",key)
  345. gameManager.cache.set(`${level}_${category_id}`,list)
  346. StorageManager.instance.setGlobalData(key,"1")
  347. call_back();
  348. }
  349. }
  350. tools.loadRemoteImg(data.img,(sf)=>{
  351. sf.addRef();
  352. list.set(data.img,sf);
  353. img_count_component++;
  354. img_call_back_component();
  355. })
  356. for (let index = 0; index < data.component.length; index++) {
  357. const element = data.component[index];
  358. tools.loadRemoteImg(element.img,(sf,id)=>{
  359. sf.addRef();
  360. list.set(element.img,sf);
  361. img_count_component++;
  362. img_call_back_component();
  363. },element.id);
  364. }
  365. break;
  366. }
  367. }
  368. }
  369. })
  370. }
  371. //通用的关闭按钮点击音效
  372. public static playCloseBtnSound( loop:boolean = false){
  373. let path = gameManager.g_server_sys_info.sys_click_button_music;
  374. AudioManager.instance.playSound(path,loop)
  375. }
  376. //通用的按钮点击音效
  377. public static playBtnSound( loop:boolean = false){
  378. let path = gameManager.g_server_sys_info.sys_close_button_music;
  379. AudioManager.instance.playSound(path,loop)
  380. }
  381. //每个玩法的胜利音效
  382. public static playWinSoundByCategoryId(id:number, loop:boolean = false){
  383. let paht = gameManager.get_play_list_item_by_categoryid(id).wf_victory_music;
  384. AudioManager.instance.playSound(paht,loop)
  385. }
  386. //每个玩法的失败音效
  387. public static playFailSoundByCategoryId(id:number, loop:boolean = false){
  388. let paht = gameManager.get_play_list_item_by_categoryid(id).wf_fail_music;
  389. AudioManager.instance.playSound(paht,loop)
  390. }
  391. //每个玩法的正确音效
  392. public static playRightSoundByCategoryId(id:number, loop:boolean = false){
  393. let paht = gameManager.get_play_list_item_by_categoryid(id).wf_right_click_music;
  394. AudioManager.instance.playSound(paht,loop)
  395. }
  396. //每个玩法的错误音效
  397. public static playErrSoundByCategoryId(id:number, loop:boolean = false){
  398. let paht = gameManager.get_play_list_item_by_categoryid(id).wf_wrong_click_music;
  399. AudioManager.instance.playSound(paht,loop)
  400. }
  401. //每个玩法的背景音乐
  402. public static playGamePlayMusicByCategoryId(id:number, loop:boolean = false){
  403. let path = gameManager.get_play_list_item_by_categoryid(id).wf_piped_music;
  404. AudioManager.instance.playMusic(path,loop)
  405. }
  406. //主页的背景音乐
  407. public static playMainMusic(loop:boolean = false){
  408. let path = gameManager.g_server_sys_info.sys_piped_music;
  409. AudioManager.instance.playMusic(path,loop)
  410. }
  411. public static loadSysMusic(call_back){
  412. let count = 0;
  413. let call = ()=>{
  414. count++;
  415. if(count>=3){
  416. call_back()
  417. }
  418. }
  419. assetManager.loadRemote(gameManager.g_server_sys_info.sys_click_button_music, (err: any, clip: AudioClip)=> {
  420. clip.addRef()
  421. call()
  422. });
  423. assetManager.loadRemote(gameManager.g_server_sys_info.sys_close_button_music, (err: any, clip: AudioClip)=> {
  424. clip.addRef()
  425. call()
  426. });
  427. assetManager.loadRemote(gameManager.g_server_sys_info.sys_piped_music, (err: any, clip: AudioClip)=> {
  428. clip.addRef()
  429. call()
  430. });
  431. }
  432. public static loadPlayMusicByCategoryId(id,call_back){
  433. let count = 0;
  434. let call = ()=>{
  435. count++;
  436. if(count>=5){
  437. call_back()
  438. }
  439. }
  440. let paly_item = gameManager.get_play_list_item_by_categoryid(id);
  441. if(!gameManager.mp3_cache.get(paly_item.wf_fail_music)){
  442. assetManager.loadRemote(paly_item.wf_fail_music, (err: any, clip: any)=> {
  443. clip.addRef()
  444. gameManager.mp3_cache.set(paly_item.wf_fail_music,clip)
  445. call()
  446. });
  447. }else{
  448. call()
  449. }
  450. if(!gameManager.mp3_cache.get(paly_item.wf_victory_music)){
  451. assetManager.loadRemote(paly_item.wf_victory_music, (err: any, clip: any)=> {
  452. clip.addRef()
  453. call()
  454. });
  455. }else{
  456. call()
  457. }
  458. if(!gameManager.mp3_cache.get(paly_item.wf_right_click_music)){
  459. assetManager.loadRemote(paly_item.wf_right_click_music, (err: any, clip: any)=> {
  460. clip.addRef()
  461. gameManager.mp3_cache.set(paly_item.wf_right_click_music,clip)
  462. call()
  463. });
  464. }else{
  465. call()
  466. }
  467. if(!gameManager.mp3_cache.get(paly_item.wf_wrong_click_music)){
  468. assetManager.loadRemote(paly_item.wf_wrong_click_music, (err: any, clip: any)=> {
  469. clip.addRef()
  470. gameManager.mp3_cache.set(paly_item.wf_wrong_click_music,clip)
  471. call()
  472. });
  473. }else{
  474. call()
  475. }
  476. if(!gameManager.mp3_cache.get(paly_item.wf_piped_music)){
  477. assetManager.loadRemote(paly_item.wf_piped_music, (err: any, clip: any)=> {
  478. clip.addRef()
  479. gameManager.mp3_cache.set(paly_item.wf_piped_music,clip)
  480. call()
  481. });
  482. }else{
  483. call()
  484. }
  485. }
  486. public static decRefSf(categoryid:number){
  487. let levels_item = gameManager.get_cur_level_by_categoryid(categoryid);
  488. gameManager.cache.forEach((v,k)=>{
  489. if(v!=null){
  490. let l = k.split("_");
  491. let level = parseInt(l[0]);
  492. let _categoryid = parseInt(l[1]);
  493. if(_categoryid==categoryid){
  494. if(level<levels_item.level){
  495. v.forEach((v1,k1)=>{
  496. v1.decRef()
  497. })
  498. gameManager.cache.set(`${level}_${_categoryid}`,null);
  499. }
  500. }
  501. }
  502. })
  503. }
  504. public addCoinNumber(addnum:number,lab_number:Label,cur_num:number,call_back){
  505. let _num = 0;
  506. let multiple = addnum/100<1?1:addnum/100;
  507. let schedule_num = 0.01/multiple;
  508. this.unscheduleAllCallbacks();
  509. this.schedule(()=>{
  510. _num+=1*multiple;
  511. _num = Math.floor(_num);
  512. if(_num>=addnum){
  513. lab_number.string = cur_num+addnum +"";
  514. this.unscheduleAllCallbacks()
  515. call_back();
  516. return
  517. }
  518. lab_number.string = cur_num+_num +"";
  519. },schedule_num)
  520. }
  521. // public static set_server_han_zi_zhao_bu_tong_data(data){
  522. // gameManager.g_server_han_zi_zhao_bu_tong_data.list = data;
  523. // console.log("set_server_han_zi_zhao_bu_tong_data::",data);
  524. // }
  525. // public static set_server_mei_nv_zhao_xi_jie_data(data){
  526. // gameManager.g_server_mei_nv_zhao_xi_jie_data.list = data;
  527. // console.log("set_server_mei_nv_zhao_xi_jie_data::",data);
  528. // }
  529. }