@urso/core 0.7.12 → 0.7.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urso/core",
3
- "version": "0.7.12",
3
+ "version": "0.7.14",
4
4
  "description": "HTML5 game engine",
5
5
  "main": "build/js/index.js",
6
6
  "author": "Megbrimef",
@@ -34,6 +34,34 @@ class LibHelper {
34
34
  return $_GET[name];
35
35
  }
36
36
 
37
+ /**
38
+ * waiter for dom element on page
39
+ * @param {String} selector
40
+ * @returns {Promice}
41
+ *
42
+ * @example
43
+ * waitForDomElement(.game-container).then(()=>{...})
44
+ */
45
+ waitForDomElement(selector) {
46
+ return new Promise(resolve => {
47
+ if (document.querySelector(selector)) {
48
+ return resolve(document.querySelector(selector));
49
+ }
50
+
51
+ const observer = new MutationObserver(mutations => {
52
+ if (document.querySelector(selector)) {
53
+ resolve(document.querySelector(selector));
54
+ observer.disconnect();
55
+ }
56
+ });
57
+
58
+ observer.observe(document.body, {
59
+ childList: true,
60
+ subtree: true
61
+ });
62
+ });
63
+ }
64
+
37
65
  /**
38
66
  * get uniq elements from two arrays
39
67
  * @param {Array} array1
@@ -31,15 +31,15 @@ class ModulesAssetsController {
31
31
  /**
32
32
  * instantly load initial assets and start lazy loading process, if needed
33
33
  * @param {Mixed} assets - asset or array of assets
34
- * @param {Function} callback
34
+ * @param {Function} callback
35
35
  */
36
36
  preload(assets, callback) {
37
- this.getInstance('Service').sortAssets(assets);
38
- this.getInstance('Service').startLoad(callback);
37
+ const assetsSpace = this.getInstance('Service').sortAssets(assets);
38
+ this.getInstance('Service').startLoad(assetsSpace, callback);
39
39
  }
40
40
 
41
41
  loadGroup(name, callback) {
42
- this.getInstance('Service').loadGroup(name, callback);
42
+ this.getInstance('Service').loadGroup(null, name, callback);
43
43
  }
44
44
  }
45
45
 
@@ -4,52 +4,104 @@ class ModulesAssetsService {
4
4
  this.singleton = true;
5
5
 
6
6
  this.assets = {};
7
+ this._loadCounter = 0;
7
8
 
8
9
  this._currentQuality = 'auto';
9
10
  this._addedAssetsCache = [];
10
11
  this.lazyLoadProcessStarted = false;
11
12
  };
12
13
 
14
+ /**
15
+ * get current quality
16
+ * @returns {String}
17
+ */
13
18
  getQuality() {
14
19
  return this._currentQuality;
15
20
  }
16
21
 
22
+ /**
23
+ * Update quality
24
+ */
17
25
  updateQuality() {
18
26
  this._currentQuality = this._detectQuality();
19
27
  Urso.addInstancesMode(this._currentQuality + 'Quality');
20
28
  }
21
29
 
30
+ /**
31
+ * sort assets and store to assets space
32
+ * @param {Mixed} assets - asset or array of assets
33
+ * @returns {Object}
34
+ */
22
35
  sortAssets(assets) {
23
- this.assets[this.getInstance('Config').loadingGroups.initial] = [];
36
+ const assetsSpace = this._createNewAssetsSpace();
37
+ assetsSpace[this.getInstance('Config').loadingGroups.initial] = [];
24
38
 
25
39
  if (Array.isArray(assets))
26
40
  for (let asset of assets)
27
- this._addAsset(asset);
41
+ this._addAsset(assetsSpace, asset);
28
42
  else
29
- this._addAsset(assets);
43
+ this._addAsset(assetsSpace, assets);
44
+
45
+ return assetsSpace;
30
46
  }
31
47
 
32
- startLoad(callback) {
48
+ /**
49
+ * start load assetsSpace
50
+ * @param {Object} assetsSpace
51
+ * @param {Function} callback
52
+ */
53
+ startLoad(assetsSpace, callback) {
33
54
  this.loadGroup(
55
+ assetsSpace,
34
56
  this.getInstance('Config').loadingGroups.initial,
35
57
  (() => { callback(); this._startLazyLoad(); }).bind(this)
36
58
  )
37
59
  }
38
60
 
61
+ /**
62
+ * load update handler. Setup to pixi loader
63
+ * @param {Number} param
64
+ */
39
65
  loadUpdate(param) {
40
66
  Urso.scenes.loadUpdate(Math.floor(param.progress));
41
67
  }
42
68
 
43
- loadGroup(group, callback = () => { }) {
44
- if (!this.assets[group])
69
+ /**
70
+ * load assets group by name
71
+ * @param {Object} assetsSpace
72
+ * @param {String} group
73
+ * @param {Function} callback
74
+ * @returns
75
+ */
76
+ loadGroup(assetsSpace, group, callback = () => { }) {
77
+ if (!assetsSpace) //global space
78
+ assetsSpace = this.assets;
79
+
80
+ if (!assetsSpace[group])
45
81
  return Urso.logger.error('ModulesAssetsService group error, no assets:' + group + ' Check ModulesAssetsConfig please');
46
82
 
47
83
  //we need load and parse atlases at first (!)
48
- this._loadGroupAtlases(group, () => { this._loadGroupRestAssets(group, callback) });
84
+ this._loadGroupAtlases(assetsSpace, group, () => { this._loadGroupRestAssets(assetsSpace, group, callback) });
85
+ }
86
+
87
+ /**
88
+ * create new assets space for loading
89
+ * @returns {Object}
90
+ */
91
+ _createNewAssetsSpace() {
92
+ this._loadCounter++;
93
+ this.assets[this._loadCounter] = {};
94
+ return this.assets[this._loadCounter];
49
95
  }
50
96
 
51
- _loadGroupAtlases(group, callback) {
52
- const atlases = this.assets[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
97
+ /**
98
+ * load atlases from assets group
99
+ * @param {Object} assetsSpace
100
+ * @param {String} group
101
+ * @param {Function} callback
102
+ */
103
+ _loadGroupAtlases(assetsSpace, group, callback) {
104
+ const atlases = assetsSpace[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
53
105
 
54
106
  if (!atlases.length)
55
107
  return callback();
@@ -59,15 +111,21 @@ class ModulesAssetsService {
59
111
  for (let assetModel of atlases)
60
112
  this._addAssetToLoader(assetModel, loader);
61
113
 
62
- loader.start(() => { this._processLoadedAtlases(group); callback(); });
114
+ loader.start(() => { this._processLoadedAtlases(assetsSpace, group); callback(); });
63
115
  }
64
116
 
65
- _loadGroupRestAssets(group, callback) {
117
+ /**
118
+ * load rest assets (atkases is loaded)
119
+ * @param {Object} assetsSpace
120
+ * @param {String} group
121
+ * @param {Function} callback
122
+ */
123
+ _loadGroupRestAssets(assetsSpace, group, callback) {
66
124
  let loader = Urso.getInstance('Lib.Loader');
67
125
  loader.setOnLoadUpdate(this.loadUpdate.bind(this));
68
126
  const noAtlasSpines = [];
69
127
 
70
- for (let assetModel of this.assets[group])
128
+ for (let assetModel of assetsSpace[group])
71
129
  if (assetModel.type !== Urso.types.assets.ATLAS)
72
130
  if (!Urso.cache.getFile(assetModel.path)) {
73
131
  //filter noAtlas Spine files
@@ -79,7 +137,7 @@ class ModulesAssetsService {
79
137
 
80
138
  loader.start(
81
139
  () => {
82
- this._processLoadedAssets(group);
140
+ this._processLoadedAssets(assetsSpace, group);
83
141
  this._loadNoAtlasSpines(noAtlasSpines, () => {
84
142
  this.emit(Urso.events.MODULES_ASSETS_GROUP_LOADED, group);
85
143
  callback();
@@ -88,6 +146,12 @@ class ModulesAssetsService {
88
146
  );
89
147
  }
90
148
 
149
+ /**
150
+ * load spines without .atlas files
151
+ * @param {Array} noAtlasSpines
152
+ * @param {Function} callback
153
+ * @returns
154
+ */
91
155
  _loadNoAtlasSpines(noAtlasSpines, callback) {
92
156
  if (!noAtlasSpines.length)
93
157
  return callback();
@@ -100,8 +164,13 @@ class ModulesAssetsService {
100
164
  loader.start(callback);
101
165
  }
102
166
 
103
- _processLoadedAtlases(group) {
104
- const atlases = this.assets[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
167
+ /**
168
+ * process loaded atlases
169
+ * @param {Object} assetsSpace
170
+ * @param {String} group
171
+ */
172
+ _processLoadedAtlases(assetsSpace, group) {
173
+ const atlases = assetsSpace[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
105
174
 
106
175
  for (let assetModel of atlases) {
107
176
  const assetKey = assetModel.key;
@@ -117,17 +186,17 @@ class ModulesAssetsService {
117
186
  newFilename = folderPath + '/' + frame.filename;
118
187
 
119
188
  Urso.cache.addFile(newFilename, texture);
120
-
121
- if(assetModel.cacheTextures) {
122
- const textureKey = newFilename.split('/').pop().split('.')[0];
123
- Urso.cache.addTexture(textureKey, texture);
124
- }
125
189
  }
126
190
  }
127
191
  }
128
192
 
129
- _processLoadedAssets(group) {
130
- for (let assetModel of this.assets[group]) {
193
+ /**
194
+ * process loaded assets
195
+ * @param {Object} assetsSpace
196
+ * @param {String} group
197
+ */
198
+ _processLoadedAssets(assetsSpace, group) {
199
+ for (let assetModel of assetsSpace[group]) {
131
200
  if (assetModel.type === Urso.types.assets.IMAGE)
132
201
  this._processLoadedImage(assetModel);
133
202
 
@@ -138,9 +207,13 @@ class ModulesAssetsService {
138
207
  this._processLoadedFont(assetModel);
139
208
  }
140
209
 
141
- delete this.assets[group];
210
+ delete assetsSpace[group];
142
211
  }
143
212
 
213
+ /**
214
+ * process loaded font
215
+ * @param {Object} source
216
+ */
144
217
  _processLoadedFont(source) {
145
218
  const data = Urso.cache.getFile(source.key);
146
219
  const font = new FontFace(source.key, data.data);
@@ -149,10 +222,19 @@ class ModulesAssetsService {
149
222
  });
150
223
  }
151
224
 
225
+ /**
226
+ * process loaded bitmap font
227
+ * @param {Object} source
228
+ */
152
229
  _processLoadedBitmapFont(assetModel) {
153
230
  this._updateFontKey(assetModel.key)
154
231
  }
155
232
 
233
+ /**
234
+ * Update font key if cannot use original
235
+ * @param {String} fontName
236
+ * @returns
237
+ */
156
238
  _updateFontKey(fontName) {
157
239
  const fontData = Urso.cache.getBitmapFont(fontName);
158
240
 
@@ -167,11 +249,19 @@ class ModulesAssetsService {
167
249
  }
168
250
  }
169
251
 
252
+ /**
253
+ * get current assets resolution
254
+ * @returns {Number}
255
+ */
170
256
  getCurrentResolution() {
171
257
  const { qualityFactors, defaultQualityFactor } = this.getInstance('Config');
172
258
  return qualityFactors[this._currentQuality] || defaultQualityFactor || 1;
173
259
  }
174
260
 
261
+ /**
262
+ * process loaded image
263
+ * @param {Object} assetModel
264
+ */
175
265
  _processLoadedImage(assetModel) {
176
266
  const resolution = this.getCurrentResolution();
177
267
 
@@ -205,7 +295,13 @@ class ModulesAssetsService {
205
295
  }
206
296
  }
207
297
 
208
- _addAsset(asset, loadingGroup) {
298
+ /**
299
+ * add asset
300
+ * @param {Object} assetsSpace
301
+ * @param {Object} asset
302
+ * @param {String} loadingGroup
303
+ */
304
+ _addAsset(assetsSpace, asset, loadingGroup) {
209
305
  //cache for all assets. We do not need to load same assets twice or more
210
306
  if (asset.type !== Urso.types.assets.CONTAINER) {
211
307
  let addedAssetKey = `${asset.type}_${asset.key}`;
@@ -257,19 +353,26 @@ class ModulesAssetsService {
257
353
  //check if container
258
354
  if (model.contents) {
259
355
  for (let content of model.contents) {
260
- this._addAsset(content, model.loadingGroup);
356
+ this._addAsset(assetsSpace, content, model.loadingGroup);
261
357
  }
262
358
 
263
359
  return;
264
360
  }
265
361
 
266
- //add single asset to loading group
267
- if (!this.assets[model.loadingGroup])
268
- this.assets[model.loadingGroup] = [];
362
+ if (model.loadingGroup === this.getInstance('Config').loadingGroups.initial) {
363
+ assetsSpace[model.loadingGroup].push(model);
364
+ } else {
365
+ //add single asset to loading group
366
+ if (!this.assets[model.loadingGroup])
367
+ this.assets[model.loadingGroup] = [];
269
368
 
270
- this.assets[model.loadingGroup].push(model);
369
+ this.assets[model.loadingGroup].push(model);
370
+ }
271
371
  }
272
372
 
373
+ /**
374
+ * start lazy load process
375
+ */
273
376
  _startLazyLoad() {
274
377
  if (this.lazyLoadProcessStarted)
275
378
  return;
@@ -278,6 +381,10 @@ class ModulesAssetsService {
278
381
  this._continueLazyLoad();
279
382
  }
280
383
 
384
+ /**
385
+ * continue lazy load process (with current step)
386
+ * @param {Number} step
387
+ */
281
388
  _continueLazyLoad(step) {
282
389
  if (!step)
283
390
  step = 0;
@@ -297,6 +404,12 @@ class ModulesAssetsService {
297
404
  this.loadGroup(groupName, () => { this._continueLazyLoad(step + 1); })
298
405
  }
299
406
 
407
+ /**
408
+ * quality reducer
409
+ * @param {Object} qualityFactors
410
+ * @param {Number} widthFactor
411
+ * @returns
412
+ */
300
413
  _qualityReducer(qualityFactors, widthFactor) {
301
414
  return [(acc, val) => {
302
415
  if (acc === null) {
@@ -315,6 +428,10 @@ class ModulesAssetsService {
315
428
  }, null]
316
429
  }
317
430
 
431
+ /**
432
+ * detect assets quality
433
+ * @returns {Number}
434
+ */
318
435
  _detectQuality() {
319
436
  const { qualityFactors } = this.getInstance('Config');
320
437
  const userQuality = Urso.helper.parseGetParams()['quality'];
@@ -326,6 +443,10 @@ class ModulesAssetsService {
326
443
  return this._calculateQuality(qualityFactors);
327
444
  }
328
445
 
446
+ /**
447
+ * calculate quality
448
+ * @param {Object} qualityFactors
449
+ */
329
450
  _calculateQuality(qualityFactors) {
330
451
  const { android, iOS, iPad, macOS } = Urso.device;
331
452
  const isMobile = android || iOS || iPad;
@@ -358,6 +479,11 @@ class ModulesAssetsService {
358
479
  .reduce(...this._qualityReducer(qualityFactors, widthFactor));
359
480
  }
360
481
 
482
+ /**
483
+ * add asset to loader instance
484
+ * @param {Object} assetModel
485
+ * @param {Object} loader
486
+ */
361
487
  _addAssetToLoader(assetModel, loader) {
362
488
  if (assetModel.path)
363
489
  loader.addAsset(assetModel);