javascript - Phaser.io 如何在全局范围内使用国家独立 Assets

标签 javascript caching html5-canvas ecmascript-5 phaser-framework

我想在切换到状态 b(其中 >phaserGameInstancePhaser.Game 的实例。

由于所有资源都全局存储在浏览器缓存和 phaserGameInstance.cache 中,因此它们应该在所有状态下都可用,但实际上并非如此。

我找到的解决方法是使用状态 a 的缓存对象的属性来扩展状态 b 的缓存对象,这有点令人不安,而且可能不是预期方式:

var priorCache = phaserGameInstance.state.getCurrentState().cache; // State 'a'

phaserGameInstance.state.start('b'); // Switch to state 'b'

jQuery.extend( // Merges the cache of state 'a' recursively
  true,        // into the cache of the current state 'b'
  phaserGameInstance.state.getCurrentState().cache,
  priorCache
);

我还没有测试过在状态 b 中预加载资源时这是否有效(也许合并过程会覆盖状态 b 的属性),但因为我仅在状态 a 时预加载我的内容,这是我当前正在使用的修复。

如何能够独立于其状态使用预加载的资源?

最佳答案

调用phaserGameInstance.state.start('b')实际上并没有将状态从a切换到b。它只是将状态 b 指定为要切换到的挂起状态。这意味着它在某种程度上是一种异步方法。

调用 phaserGameInstance.state.start('b') 后立即将对象添加到 phaserGameInstance.world 会将对象添加到状态 a而状态 b 仍处于待处理状态,并将在下一次游戏更新中激活。更新发生后,phaserGameInstance.world 为空,因为当状态 a 关闭时,所有对象都将被删除。所以不需要合并缓存什么的。

解决方案如下:

phaserGameInstance.state.add(
  'b',
  {
    create: function () { // Add the assets loaded in state 'a' here ...
        phaserGameInstance.add.image(0, 0, 'myImage');
      }
  }
);

phaserGameInstante.state.start('b');

// ... not here! State 'a' is still active in this line.

由于对象被添加到状态 a 中,因此它们似乎依赖于它们预加载的状态,但正如我的问题中所假设的那样,它们实际上是独立的状态。

关于javascript - Phaser.io 如何在全局范围内使用国家独立 Assets ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423324/

相关文章:

Javascript/HTML5 canvas bug 变量, "Not defined"但已定义

javascript - 页面重新加载后,如何跟踪 JavaScript 中的全局字典值?

javascript - 将行添加到 HTML 表而不重新渲染的最佳方法

javascript - 无法将自定义标记添加到 Google map ( JS )

javascript - 使用 MakeStyles 更改 SVG 填充颜色 : how to choose specific IDs in SVG file using Selectors?

c# - 在本地 SQL Server 存储表的缓存拷贝

javascript - onbeforeunload 处理程序真的会停止我的页面缓存吗?

caching - 在 L2 逐出时从 L1 缓存中逐出缓存

html5-canvas - 如何隐藏 anchor 并在点击图像时显示 anchor

javascript - 在 FabricJS 中,更改图像元素的 src 会更改该对象的所有属性