melonjs 15.14.0 → 15.15.0

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.
Files changed (146) hide show
  1. package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +1 -1
  2. package/dist/melonjs.mjs/_virtual/earcut.js +1 -1
  3. package/dist/melonjs.mjs/_virtual/howler.js +1 -1
  4. package/dist/melonjs.mjs/_virtual/index.js +1 -1
  5. package/dist/melonjs.mjs/application/application.js +1 -1
  6. package/dist/melonjs.mjs/application/header.js +1 -1
  7. package/dist/melonjs.mjs/application/resize.js +1 -1
  8. package/dist/melonjs.mjs/application/settings.js +1 -1
  9. package/dist/melonjs.mjs/audio/audio.js +1 -1
  10. package/dist/melonjs.mjs/camera/camera2d.js +1 -1
  11. package/dist/melonjs.mjs/const.js +1 -1
  12. package/dist/melonjs.mjs/geometries/ellipse.js +1 -1
  13. package/dist/melonjs.mjs/geometries/line.js +1 -1
  14. package/dist/melonjs.mjs/geometries/path2d.js +1 -1
  15. package/dist/melonjs.mjs/geometries/point.js +1 -1
  16. package/dist/melonjs.mjs/geometries/poly.js +1 -1
  17. package/dist/melonjs.mjs/geometries/rectangle.js +1 -1
  18. package/dist/melonjs.mjs/geometries/roundrect.js +1 -1
  19. package/dist/melonjs.mjs/index.js +2 -2
  20. package/dist/melonjs.mjs/input/gamepad.js +1 -1
  21. package/dist/melonjs.mjs/input/input.js +1 -1
  22. package/dist/melonjs.mjs/input/keyboard.js +1 -1
  23. package/dist/melonjs.mjs/input/pointer.js +1 -1
  24. package/dist/melonjs.mjs/input/pointerevent.js +1 -1
  25. package/dist/melonjs.mjs/lang/console.js +1 -1
  26. package/dist/melonjs.mjs/lang/deprecated.js +1 -1
  27. package/dist/melonjs.mjs/level/level.js +1 -1
  28. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +1 -1
  29. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +1 -1
  30. package/dist/melonjs.mjs/level/tiled/TMXObject.js +1 -1
  31. package/dist/melonjs.mjs/level/tiled/TMXTile.js +1 -1
  32. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +1 -1
  33. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +1 -1
  34. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +1 -1
  35. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +1 -1
  36. package/dist/melonjs.mjs/level/tiled/constants.js +1 -1
  37. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +1 -1
  38. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +1 -1
  39. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +1 -1
  40. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +1 -1
  41. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +1 -1
  42. package/dist/melonjs.mjs/level/tiled/renderer/autodetect.js +1 -1
  43. package/dist/melonjs.mjs/loader/cache.js +1 -1
  44. package/dist/melonjs.mjs/loader/loader.js +1 -1
  45. package/dist/melonjs.mjs/loader/loadingscreen.js +1 -1
  46. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +1 -1
  47. package/dist/melonjs.mjs/loader/parsers/binary.js +1 -1
  48. package/dist/melonjs.mjs/loader/parsers/fontface.js +1 -1
  49. package/dist/melonjs.mjs/loader/parsers/image.js +1 -1
  50. package/dist/melonjs.mjs/loader/parsers/json.js +1 -1
  51. package/dist/melonjs.mjs/loader/parsers/script.js +1 -1
  52. package/dist/melonjs.mjs/loader/parsers/tmx.js +1 -1
  53. package/dist/melonjs.mjs/loader/settings.js +1 -1
  54. package/dist/melonjs.mjs/math/color.js +1 -1
  55. package/dist/melonjs.mjs/math/math.js +1 -1
  56. package/dist/melonjs.mjs/math/matrix2.js +1 -1
  57. package/dist/melonjs.mjs/math/matrix3.js +1 -1
  58. package/dist/melonjs.mjs/math/observable_vector2.js +1 -1
  59. package/dist/melonjs.mjs/math/observable_vector3.js +1 -1
  60. package/dist/melonjs.mjs/math/vector2.js +1 -1
  61. package/dist/melonjs.mjs/math/vector3.js +1 -1
  62. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.js +1 -1
  63. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/esm/multimap.js +1 -1
  64. package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +1 -1
  65. package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +1 -1
  66. package/dist/melonjs.mjs/node_modules/eventemitter3/index2.js +1 -1
  67. package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +1 -1
  68. package/dist/melonjs.mjs/particles/emitter.js +1 -1
  69. package/dist/melonjs.mjs/particles/particle.js +1 -1
  70. package/dist/melonjs.mjs/particles/settings.js +1 -1
  71. package/dist/melonjs.mjs/physics/body.js +1 -1
  72. package/dist/melonjs.mjs/physics/bounds.js +1 -1
  73. package/dist/melonjs.mjs/physics/collision.js +1 -1
  74. package/dist/melonjs.mjs/physics/detector.js +1 -1
  75. package/dist/melonjs.mjs/physics/quadtree.js +1 -1
  76. package/dist/melonjs.mjs/physics/response.js +1 -1
  77. package/dist/melonjs.mjs/physics/sat.js +1 -1
  78. package/dist/melonjs.mjs/physics/world.js +1 -1
  79. package/dist/melonjs.mjs/plugin/plugin.js +3 -3
  80. package/dist/melonjs.mjs/renderable/collectable.js +1 -1
  81. package/dist/melonjs.mjs/renderable/colorlayer.js +1 -1
  82. package/dist/melonjs.mjs/renderable/container.js +1 -1
  83. package/dist/melonjs.mjs/renderable/draggable.js +1 -1
  84. package/dist/melonjs.mjs/renderable/dragndrop.js +1 -1
  85. package/dist/melonjs.mjs/renderable/entity/entity.js +1 -1
  86. package/dist/melonjs.mjs/renderable/imagelayer.js +12 -11
  87. package/dist/melonjs.mjs/renderable/light2d.js +1 -1
  88. package/dist/melonjs.mjs/renderable/nineslicesprite.js +1 -1
  89. package/dist/melonjs.mjs/renderable/renderable.js +19 -1
  90. package/dist/melonjs.mjs/renderable/sprite.js +1 -1
  91. package/dist/melonjs.mjs/renderable/text/bitmaptext.js +1 -1
  92. package/dist/melonjs.mjs/renderable/text/bitmaptextdata.js +1 -1
  93. package/dist/melonjs.mjs/renderable/text/glyph.js +1 -1
  94. package/dist/melonjs.mjs/renderable/text/text.js +1 -1
  95. package/dist/melonjs.mjs/renderable/text/textmetrics.js +1 -1
  96. package/dist/melonjs.mjs/renderable/text/textstyle.js +1 -1
  97. package/dist/melonjs.mjs/renderable/trigger.js +1 -1
  98. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +1 -1
  99. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +1 -1
  100. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +1 -1
  101. package/dist/melonjs.mjs/state/stage.js +1 -1
  102. package/dist/melonjs.mjs/state/state.js +1 -1
  103. package/dist/melonjs.mjs/system/device.js +1 -1
  104. package/dist/melonjs.mjs/system/dom.js +1 -1
  105. package/dist/melonjs.mjs/system/event.js +1 -1
  106. package/dist/melonjs.mjs/system/platform.js +1 -1
  107. package/dist/melonjs.mjs/system/pooling.js +1 -1
  108. package/dist/melonjs.mjs/system/save.js +1 -1
  109. package/dist/melonjs.mjs/system/timer.js +1 -1
  110. package/dist/melonjs.mjs/tweens/easing.js +1 -1
  111. package/dist/melonjs.mjs/tweens/interpolation.js +1 -1
  112. package/dist/melonjs.mjs/tweens/tween.js +1 -1
  113. package/dist/melonjs.mjs/utils/agent.js +1 -1
  114. package/dist/melonjs.mjs/utils/array.js +1 -1
  115. package/dist/melonjs.mjs/utils/file.js +1 -1
  116. package/dist/melonjs.mjs/utils/function.js +1 -1
  117. package/dist/melonjs.mjs/utils/string.js +1 -1
  118. package/dist/melonjs.mjs/utils/utils.js +1 -1
  119. package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +1 -1
  120. package/dist/melonjs.mjs/video/renderer.js +1 -1
  121. package/dist/melonjs.mjs/video/texture/atlas.js +1 -1
  122. package/dist/melonjs.mjs/video/texture/cache.js +1 -1
  123. package/dist/melonjs.mjs/video/texture/canvas_texture.js +1 -1
  124. package/dist/melonjs.mjs/video/utils/autodetect.js +1 -1
  125. package/dist/melonjs.mjs/video/video.js +1 -1
  126. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +1 -1
  127. package/dist/melonjs.mjs/video/webgl/compositors/compositor.js +1 -1
  128. package/dist/melonjs.mjs/video/webgl/compositors/primitive_compositor.js +1 -1
  129. package/dist/melonjs.mjs/video/webgl/compositors/quad_compositor.js +1 -1
  130. package/dist/melonjs.mjs/video/webgl/glshader.js +1 -1
  131. package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +1 -1
  132. package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +1 -1
  133. package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +1 -1
  134. package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +1 -1
  135. package/dist/melonjs.mjs/video/webgl/utils/attributes.js +1 -1
  136. package/dist/melonjs.mjs/video/webgl/utils/precision.js +1 -1
  137. package/dist/melonjs.mjs/video/webgl/utils/program.js +1 -1
  138. package/dist/melonjs.mjs/video/webgl/utils/string.js +1 -1
  139. package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +1 -1
  140. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1 -1
  141. package/dist/melonjs.module.js +36 -16
  142. package/dist/types/renderable/imagelayer.d.ts +1 -1
  143. package/dist/types/renderable/renderable.d.ts +6 -0
  144. package/package.json +13 -13
  145. package/src/renderable/imagelayer.js +10 -9
  146. package/src/renderable/renderable.js +18 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * melonJS Game Engine - v15.14.0
2
+ * melonJS Game Engine - v15.15.0
3
3
  * http://www.melonjs.org
4
4
  * melonjs is licensed under the MIT License.
5
5
  * http://www.opensource.org/licenses/mit-license
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * melonJS Game Engine - v15.14.0
2
+ * melonJS Game Engine - v15.15.0
3
3
  * http://www.melonjs.org
4
4
  * melonjs is licensed under the MIT License.
5
5
  * http://www.opensource.org/licenses/mit-license
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * melonJS Game Engine - v15.14.0
2
+ * melonJS Game Engine - v15.15.0
3
3
  * http://www.melonjs.org
4
4
  * melonjs is licensed under the MIT License.
5
5
  * http://www.opensource.org/licenses/mit-license
@@ -61,8 +61,9 @@ var global$e =
61
61
  // eslint-disable-next-line no-restricted-globals -- safe
62
62
  check(typeof self == 'object' && self) ||
63
63
  check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||
64
+ check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||
64
65
  // eslint-disable-next-line no-new-func -- fallback
65
- (function () { return this; })() || commonjsGlobal || Function('return this')();
66
+ (function () { return this; })() || Function('return this')();
66
67
 
67
68
  var global$f = /*@__PURE__*/getDefaultExportFromCjs(global$e);
68
69
 
@@ -473,10 +474,10 @@ var store$2 = sharedStore;
473
474
  (shared$5.exports = function (key, value) {
474
475
  return store$2[key] || (store$2[key] = value !== undefined ? value : {});
475
476
  })('versions', []).push({
476
- version: '3.33.0',
477
+ version: '3.33.3',
477
478
  mode: IS_PURE ? 'pure' : 'global',
478
479
  copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',
479
- license: 'https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE',
480
+ license: 'https://github.com/zloirock/core-js/blob/v3.33.3/LICENSE',
480
481
  source: 'https://github.com/zloirock/core-js'
481
482
  });
482
483
 
@@ -17622,6 +17623,9 @@ class Renderable extends Rect {
17622
17623
  // viewport flag
17623
17624
  this._inViewport = false;
17624
17625
 
17626
+ // cache value for the parentApp
17627
+ this._parentApp = undefined;
17628
+
17625
17629
  // renderable cache tint value used by the getter/setter
17626
17630
  this._tint = pool.pull("Color", 255, 255, 255, 1.0);
17627
17631
 
@@ -17629,6 +17633,20 @@ class Renderable extends Rect {
17629
17633
  this.setOpacity(1.0);
17630
17634
  }
17631
17635
 
17636
+ /**
17637
+ * returns the parent application (or game) to which this renderable is attached to
17638
+ * @return {Application} the parent application or undefined if not attached to any container/app
17639
+ */
17640
+ get parentApp() {
17641
+ if (typeof this._parentApp === "undefined") {
17642
+ if (typeof this.ancestor !== "undefined" && typeof this.ancestor.getRootAncestor === "function") {
17643
+ // the `app` property is only defined in the world "root" container
17644
+ this._parentApp = this.ancestor.getRootAncestor().app;
17645
+ }
17646
+ }
17647
+ return this._parentApp;
17648
+ }
17649
+
17632
17650
  /**
17633
17651
  * Whether the renderable object is floating (i.e. used screen coordinates), or contained in a floating parent container
17634
17652
  * @see Renderable#floating
@@ -18154,6 +18172,7 @@ class Renderable extends Rect {
18154
18172
  }
18155
18173
 
18156
18174
  this.ancestor = undefined;
18175
+ this._parentApp = undefined;
18157
18176
 
18158
18177
  // destroy the physic body if defined and is a builtin body object
18159
18178
  if ((typeof this.body !== "undefined") && (typeof this.body.destroy === "function")) {
@@ -33066,14 +33085,12 @@ class ImageLayer extends Sprite {
33066
33085
  on(VIEWPORT_ONCHANGE, this.updateLayer, this);
33067
33086
  on(VIEWPORT_ONRESIZE, this.resize, this);
33068
33087
  // force a first refresh when the level is loaded
33069
- once(LEVEL_LOADED, () => {
33070
- this.updateLayer(game.viewport.pos);
33071
- });
33088
+ on(LEVEL_LOADED, this.updateLayer, this);
33072
33089
  // in case the level is not added to the root container,
33073
33090
  // the onActivateEvent call happens after the LEVEL_LOADED event
33074
33091
  // so we need to force a first update
33075
33092
  if (this.ancestor.root !== true) {
33076
- this.updateLayer(game.viewport.pos);
33093
+ this.updateLayer();
33077
33094
  }
33078
33095
  }
33079
33096
 
@@ -33101,10 +33118,12 @@ class ImageLayer extends Sprite {
33101
33118
  * updateLayer function
33102
33119
  * @ignore
33103
33120
  */
33104
- updateLayer(vpos) {
33121
+ updateLayer() {
33105
33122
  const rx = this.ratio.x,
33106
33123
  ry = this.ratio.y;
33107
33124
 
33125
+ const viewport = game.viewport;
33126
+
33108
33127
  if (rx === 0 && ry === 0) {
33109
33128
  // static image
33110
33129
  return;
@@ -33112,8 +33131,8 @@ class ImageLayer extends Sprite {
33112
33131
 
33113
33132
  const width = this.width,
33114
33133
  height = this.height,
33115
- bw = game.viewport.bounds.width,
33116
- bh = game.viewport.bounds.height,
33134
+ bw = viewport.bounds.width,
33135
+ bh = viewport.bounds.height,
33117
33136
  ax = this.anchorPoint.x,
33118
33137
  ay = this.anchorPoint.y,
33119
33138
 
@@ -33123,8 +33142,8 @@ class ImageLayer extends Sprite {
33123
33142
  * See https://github.com/melonjs/melonJS/issues/741#issuecomment-138431532
33124
33143
  * for a thorough description of how this works.
33125
33144
  */
33126
- x = ax * (rx - 1) * (bw - game.viewport.width) + this.offset.x - rx * vpos.x,
33127
- y = ay * (ry - 1) * (bh - game.viewport.height) + this.offset.y - ry * vpos.y;
33145
+ x = ax * (rx - 1) * (bw - viewport.width) + this.offset.x - rx * viewport.pos.x,
33146
+ y = ay * (ry - 1) * (bh - viewport.height) + this.offset.y - ry * viewport.pos.y;
33128
33147
 
33129
33148
 
33130
33149
  // Repeat horizontally; start drawing from left boundary
@@ -33205,6 +33224,7 @@ class ImageLayer extends Sprite {
33205
33224
  // cancel all event subscriptions
33206
33225
  off(VIEWPORT_ONCHANGE, this.updateLayer);
33207
33226
  off(VIEWPORT_ONRESIZE, this.resize);
33227
+ off(LEVEL_LOADED, this.updateLayer);
33208
33228
  }
33209
33229
 
33210
33230
  /**
@@ -38436,9 +38456,9 @@ class BasePlugin {
38436
38456
  * define the minimum required version of melonJS<br>
38437
38457
  * this can be overridden by the plugin
38438
38458
  * @type {string}
38439
- * @default "15.14.0"
38459
+ * @default "15.15.0"
38440
38460
  */
38441
- this.version = "15.14.0";
38461
+ this.version = "15.15.0";
38442
38462
 
38443
38463
  /**
38444
38464
  * a reference to the app/game that registered this plugin
@@ -38720,7 +38740,7 @@ Renderer.prototype.getHeight = function() {
38720
38740
  * @name version
38721
38741
  * @type {string}
38722
38742
  */
38723
- const version = "15.14.0";
38743
+ const version = "15.15.0";
38724
38744
 
38725
38745
  /**
38726
38746
  * a flag indicating that melonJS is fully initialized
@@ -67,7 +67,7 @@ export default class ImageLayer extends Sprite {
67
67
  * updateLayer function
68
68
  * @ignore
69
69
  */
70
- updateLayer(vpos: any): void;
70
+ updateLayer(): void;
71
71
  /**
72
72
  * override the default predraw function
73
73
  * as repeat and anchor are managed directly in the draw method
@@ -199,7 +199,13 @@ export default class Renderable extends Rect {
199
199
  y: boolean;
200
200
  };
201
201
  _inViewport: boolean;
202
+ _parentApp: any;
202
203
  _tint: object;
204
+ /**
205
+ * returns the parent application (or game) to which this renderable is attached to
206
+ * @return {Application} the parent application or undefined if not attached to any container/app
207
+ */
208
+ get parentApp(): Application;
203
209
  /**
204
210
  * Whether the renderable object is floating (i.e. used screen coordinates), or contained in a floating parent container
205
211
  * @see Renderable#floating
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "melonjs",
3
- "version": "15.14.0",
3
+ "version": "15.15.0",
4
4
  "description": "melonJS Game Engine",
5
5
  "homepage": "http://www.melonjs.org/",
6
6
  "type": "module",
@@ -53,36 +53,36 @@
53
53
  ],
54
54
  "dependencies": {
55
55
  "@teppeis/multimaps": "^3.0.0",
56
- "core-js": "^3.33.0",
56
+ "core-js": "^3.33.3",
57
57
  "earcut": "2.2.4",
58
58
  "eventemitter3": "^5.0.1",
59
59
  "howler": "2.2.4"
60
60
  },
61
61
  "devDependencies": {
62
- "@babel/eslint-parser": "^7.22.15",
63
- "@babel/plugin-syntax-import-assertions": "^7.22.5",
64
- "@fastify/static": "^6.11.2",
62
+ "@babel/eslint-parser": "^7.23.3",
63
+ "@babel/plugin-syntax-import-assertions": "^7.23.3",
64
+ "@fastify/static": "^6.12.0",
65
65
  "@melonjs/webdoc-theme": "^1.1.1",
66
66
  "@rollup/plugin-commonjs": "^25.0.7",
67
67
  "@rollup/plugin-image": "^3.0.3",
68
68
  "@rollup/plugin-node-resolve": "^15.2.3",
69
- "@rollup/plugin-replace": "^5.0.4",
69
+ "@rollup/plugin-replace": "^5.0.5",
70
70
  "@webdoc/cli": "^2.2.0",
71
- "chromedriver": "^118.0.0",
71
+ "chromedriver": "^119.0.1",
72
72
  "cross-env": "^7.0.3",
73
73
  "del-cli": "^5.1.0",
74
- "eslint": "^8.51.0",
75
- "eslint-plugin-jsdoc": "^46.8.2",
74
+ "eslint": "^8.54.0",
75
+ "eslint-plugin-jsdoc": "^46.9.0",
76
76
  "expect": "^29.7.0",
77
77
  "expect-mocha-image-snapshot": "^3.0.15",
78
- "fastify": "^4.24.2",
78
+ "fastify": "^4.24.3",
79
79
  "mocha": "^10.2.0",
80
80
  "npm-self-link": "^1.1.7",
81
- "puppeteer": "^21.3.8",
82
- "rollup": "^4.1.3",
81
+ "puppeteer": "^21.5.2",
82
+ "rollup": "^4.5.0",
83
83
  "rollup-plugin-bundle-size": "^1.0.3",
84
84
  "rollup-plugin-string": "^3.0.0",
85
- "terser": "^5.21.0",
85
+ "terser": "^5.24.0",
86
86
  "typescript": "^5.2.2"
87
87
  },
88
88
  "scripts": {
@@ -124,14 +124,12 @@ export default class ImageLayer extends Sprite {
124
124
  event.on(event.VIEWPORT_ONCHANGE, this.updateLayer, this);
125
125
  event.on(event.VIEWPORT_ONRESIZE, this.resize, this);
126
126
  // force a first refresh when the level is loaded
127
- event.once(event.LEVEL_LOADED, () => {
128
- this.updateLayer(game.viewport.pos);
129
- });
127
+ event.on(event.LEVEL_LOADED, this.updateLayer, this);
130
128
  // in case the level is not added to the root container,
131
129
  // the onActivateEvent call happens after the LEVEL_LOADED event
132
130
  // so we need to force a first update
133
131
  if (this.ancestor.root !== true) {
134
- this.updateLayer(game.viewport.pos);
132
+ this.updateLayer();
135
133
  }
136
134
  }
137
135
 
@@ -159,10 +157,12 @@ export default class ImageLayer extends Sprite {
159
157
  * updateLayer function
160
158
  * @ignore
161
159
  */
162
- updateLayer(vpos) {
160
+ updateLayer() {
163
161
  const rx = this.ratio.x,
164
162
  ry = this.ratio.y;
165
163
 
164
+ const viewport = game.viewport;
165
+
166
166
  if (rx === 0 && ry === 0) {
167
167
  // static image
168
168
  return;
@@ -170,8 +170,8 @@ export default class ImageLayer extends Sprite {
170
170
 
171
171
  const width = this.width,
172
172
  height = this.height,
173
- bw = game.viewport.bounds.width,
174
- bh = game.viewport.bounds.height,
173
+ bw = viewport.bounds.width,
174
+ bh = viewport.bounds.height,
175
175
  ax = this.anchorPoint.x,
176
176
  ay = this.anchorPoint.y,
177
177
 
@@ -181,8 +181,8 @@ export default class ImageLayer extends Sprite {
181
181
  * See https://github.com/melonjs/melonJS/issues/741#issuecomment-138431532
182
182
  * for a thorough description of how this works.
183
183
  */
184
- x = ax * (rx - 1) * (bw - game.viewport.width) + this.offset.x - rx * vpos.x,
185
- y = ay * (ry - 1) * (bh - game.viewport.height) + this.offset.y - ry * vpos.y;
184
+ x = ax * (rx - 1) * (bw - viewport.width) + this.offset.x - rx * viewport.pos.x,
185
+ y = ay * (ry - 1) * (bh - viewport.height) + this.offset.y - ry * viewport.pos.y;
186
186
 
187
187
 
188
188
  // Repeat horizontally; start drawing from left boundary
@@ -263,6 +263,7 @@ export default class ImageLayer extends Sprite {
263
263
  // cancel all event subscriptions
264
264
  event.off(event.VIEWPORT_ONCHANGE, this.updateLayer);
265
265
  event.off(event.VIEWPORT_ONRESIZE, this.resize);
266
+ event.off(event.LEVEL_LOADED, this.updateLayer);
266
267
  }
267
268
 
268
269
  /**
@@ -258,6 +258,9 @@ export default class Renderable extends Rect {
258
258
  // viewport flag
259
259
  this._inViewport = false;
260
260
 
261
+ // cache value for the parentApp
262
+ this._parentApp = undefined;
263
+
261
264
  // renderable cache tint value used by the getter/setter
262
265
  this._tint = pool.pull("Color", 255, 255, 255, 1.0);
263
266
 
@@ -265,6 +268,20 @@ export default class Renderable extends Rect {
265
268
  this.setOpacity(1.0);
266
269
  }
267
270
 
271
+ /**
272
+ * returns the parent application (or game) to which this renderable is attached to
273
+ * @return {Application} the parent application or undefined if not attached to any container/app
274
+ */
275
+ get parentApp() {
276
+ if (typeof this._parentApp === "undefined") {
277
+ if (typeof this.ancestor !== "undefined" && typeof this.ancestor.getRootAncestor === "function") {
278
+ // the `app` property is only defined in the world "root" container
279
+ this._parentApp = this.ancestor.getRootAncestor().app;
280
+ }
281
+ }
282
+ return this._parentApp;
283
+ }
284
+
268
285
  /**
269
286
  * Whether the renderable object is floating (i.e. used screen coordinates), or contained in a floating parent container
270
287
  * @see Renderable#floating
@@ -790,6 +807,7 @@ export default class Renderable extends Rect {
790
807
  }
791
808
 
792
809
  this.ancestor = undefined;
810
+ this._parentApp = undefined;
793
811
 
794
812
  // destroy the physic body if defined and is a builtin body object
795
813
  if ((typeof this.body !== "undefined") && (typeof this.body.destroy === "function")) {