phaser.io如何在全球范围内使用州独立资产

时间:2014-08-21 09:54:26

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

我想在切换到状态a之后将状态phaserGameInstance.world中预加载的图像/精灵添加到b(其中phaserGameInstancePhaser.Game的实例})。

由于所有资产都全球存储在浏览器缓存中,因此phaserGameInstance.cache所有资产都应该在所有州都可用,但实际上并非如此。

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

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这是我目前正在使用的修复程序。

如何可以独立于状态使用预加载的资产?

1 个答案:

答案 0 :(得分:0)

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

在调用phaserGameInstance.world后立即向phaserGameInstance.state.start('b')添加对象会将对象添加到状态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,似乎它们依赖于它们已被预加载的状态,但它们实际上是状态独立的,如我的问题中所假设的那样。