1

我想在切换到状态后将状态中预加载的图像/精灵添加到状态a(其中是 的实例)。phaserGameInstance.worldbphaserGameInstancePhaser.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(也许合并过程会覆盖 state 的属性b),但由于我只在状态下预加载我的东西,a这是我目前正在使用的修复。

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

4

1 回答 1

0

调用phaserGameInstance.state.start('b')实际上不会将状态从 切换ab。它只是将状态分配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中,因此它们似乎依赖于它们已预加载的状态,但它们实际上与我的问题中假设的状态无关。

于 2014-08-21T15:49:37.207 回答