制作一个可以重复使用而不会在第二次“打开”时崩溃的“FlxSubState”?

Making a `FlxSubState` that can be re-used without it crashing on the second `open`?

通常,当我想打开我在代码中定义的 FlxSubState 时,我会使用:

openSubState(new MySubState());

我的所有 create/add 逻辑都在 MySubState.create()

这很好用,除非,如果该 SubState 上有很多东西,它可能会导致巨大的滞后峰值,使游戏 'freeze' 在显示子状态之前。

如果我尝试为我的子状态设置一个变量并重新使用它,它会工作一次,但是当我再次尝试打开它时 游戏崩溃 ,因为子状态在关闭时被自动销毁。

默认情况下,当 FlxSubState 关闭时,它也会被 destroy()ed - 删除所有添加的对象等。

此外,由于 newcreate 仅在第一次打开子状态时被调用,因此您 add 那里的任何内容都不会 re-added (并且您不希望每次打开子状态时都调用 new/create,因为那样不会停止 lag-spike)

解决方案很简单:在打开子状态的 FlxState 中,有一个标志 destroySubStates 将其设置为 false 并且子状态不会在关闭时被销毁。

...以及如何在打开之间更改子状态?您可以在 FlxSubState 中使用 openCallback,它会在您打开子状态时触发,在调用 create 之后(如果调用的话)和显示子状态之前。

所以:

如果你想要更新 FlxSubState 可以 re-used 减少打开时的 'lag',这就是我所做的:

在我的 PlayState 中:

override public function create():Void
{
  ...
  mySubState = new MySubState();
  destroySubStates = false;
  ...
}

public function openMySubState():Void
{
  openSubState(mySubState);
}

在 MySubState 中:

public function new():Void
{
  super(0); 
  openCallback = refresh;
}

override public function create():Void
{
  // create and add all of my elements
}

private function refresh():Void
{
  // anything that changed between last time it was open and now, update .text/etc
}

这会消除每次打开子状态时的滞后峰值!

...请记住在您的 PlayState.destroy(); 中调用 mySubState.destroy(); 以正确清理!