gameManager.ts 23 KB

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