制作一个可以重复使用而不会在第二次“打开”时崩溃的“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 - 删除所有添加的对象等。
此外,由于 new
和 create
仅在第一次打开子状态时被调用,因此您 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();
以正确清理!
通常,当我想打开我在代码中定义的 FlxSubState
时,我会使用:
openSubState(new MySubState());
我的所有 create/add 逻辑都在 MySubState.create()
这很好用,除非,如果该 SubState 上有很多东西,它可能会导致巨大的滞后峰值,使游戏 'freeze' 在显示子状态之前。
如果我尝试为我的子状态设置一个变量并重新使用它,它会工作一次,但是当我再次尝试打开它时 游戏崩溃 ,因为子状态在关闭时被自动销毁。
默认情况下,当 FlxSubState
关闭时,它也会被 destroy()
ed - 删除所有添加的对象等。
此外,由于 new
和 create
仅在第一次打开子状态时被调用,因此您 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();
以正确清理!