LoaderSystem.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /**
  2. * @description 资源加载
  3. * @author xhx
  4. */
  5. export default class LoaderSystem {
  6. private _bundle = null;
  7. public setBundle(bundle) {
  8. bundle && (this._bundle = bundle);
  9. }
  10. public getBundle() {
  11. return this._bundle || cc.resources;
  12. }
  13. /**
  14. *
  15. * @param relative_path 资源路径
  16. * @param asset_type 资源类型
  17. * @param complete_callback 完成回调【选填】
  18. * @returns 对应的资源
  19. */
  20. public loadAssetByType<T extends typeof cc.Asset>(relative_path: string, asset_type: T, complete_callback?: Function): Promise<InstanceType<T>> {
  21. return new Promise((resolve: (data) => void, reject) => {
  22. this.getBundle().load(relative_path, asset_type, (error, asset) => {
  23. if (error) {
  24. error('xx.loadAssetByType failed ... and path = ' + relative_path, '==error:', JSON.stringify(error));
  25. reject();
  26. return;
  27. } else {
  28. complete_callback && complete_callback(asset);
  29. resolve(asset);
  30. }
  31. });
  32. });
  33. }
  34. /**
  35. * 获取resource路径下资源地址数组
  36. * @param path 文件夹路径
  37. * @param type 文件类型
  38. * @returns [路径]
  39. */
  40. public getDirUrlsRecursion(path, type) {
  41. let urls = [];
  42. this.getBundle().getDirWithPath(path, type, urls);
  43. let arr_path = [];
  44. for (let i = 0; i < urls.length; i++) {
  45. const element = urls[i].path;
  46. arr_path.push(element);
  47. }
  48. return arr_path;
  49. }
  50. /**
  51. * 预加载资源 by 配置表 【暂未使用】
  52. * @param assets_config 配置表
  53. * @param progress_callback 进度回调
  54. * @param complete_callback 完成回调
  55. */
  56. public loadAssetsByConfig(assets_config, progress_callback, complete_callback) {
  57. let total_count = 0;
  58. let complete_count = 0;
  59. for (let i = 0; i < assets_config.length; i++) {
  60. let config = assets_config[i];
  61. let path = config.path;
  62. let type = config.type;
  63. let urls = [];
  64. this.getBundle().getDirWithPath(path, type, urls);
  65. total_count += urls.length;
  66. cc.log('预加载资源:%o', urls);
  67. let callback = config.cb;
  68. for (let i = 0; i < urls.length; i++) {
  69. let path = urls[i].path;
  70. this.getBundle().load(path, type, function (err, spriteFrame) {
  71. if (err) {
  72. cc.error(err.message || err);
  73. return;
  74. }
  75. ++complete_count;
  76. progress_callback && progress_callback(complete_count, total_count, spriteFrame);
  77. callback && callback(spriteFrame);
  78. if (complete_count === total_count) {
  79. complete_callback && complete_callback();
  80. }
  81. });
  82. }
  83. }
  84. }
  85. /**
  86. * 同步获取已经预加载的图集中的spriteframe 此接口进入游戏后生效
  87. * @param sprite_frame_name 要获取的纹理名字
  88. * @param path 图集路径
  89. * @returns cc.SpriteFrame
  90. */
  91. public getSpriteFrameFromAtlas(sprite_frame_name, path = '/Atlas'): cc.SpriteFrame {
  92. let urls = this.getDirUrlsRecursion(path, cc.SpriteAtlas);
  93. let len = urls.length;
  94. for (let i = 0; i < len; i++) {
  95. let url = urls[i];
  96. let atlas: any = this.getBundle().getRes(url, cc.SpriteAtlas);//resources.get
  97. if (atlas) {
  98. let sf = atlas.getSpriteFrame(sprite_frame_name);
  99. if (sf) return sf;
  100. }
  101. }
  102. }
  103. /**
  104. * 获取散图资源(需要在loading的时候首先加载)
  105. * @param sprite_frame_path 资源路径
  106. * @returns cc.SpriteFrame || null
  107. */
  108. public getSpriteFrame(sprite_frame_path: string): cc.SpriteFrame {
  109. let res = this.getBundle().getRes(sprite_frame_path, cc.SpriteFrame);
  110. return res;
  111. }
  112. /**
  113. * 获取图片纹理 by 图集
  114. * @param sprite_frame_name 要获取的纹理名字
  115. * @param arr_atlas [图集列表]
  116. * @returns cc.SpriteFrame || null
  117. */
  118. public getSpriteFrameByArrAlst(sprite_frame_name: string, arr_atlas: Array<cc.SpriteAtlas>): cc.SpriteFrame {
  119. let count = arr_atlas.length;
  120. for (let i = 0; i < count; i++) {
  121. let _atlas = arr_atlas[i];
  122. let spf = _atlas.getSpriteFrame(sprite_frame_name);
  123. if (spf) return spf;
  124. }
  125. return null;
  126. }
  127. };