gameManager.ts 21 KB

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