Переключение FlxStates

У меня возникла проблема, когда я пытаюсь вернуться к своему PlayState после входа в мое состояние меню. Когда я нажимаю "вернуться" в своем состоянии меню, я получаю сообщение об ошибке, в котором говорится, что "Исключение [Fault], information=TypeError: Ошибка #1009: невозможно получить доступ к свойству или методу ссылки на пустой объект", когда игра пытается добавить кнопка в PlayState после выхода из состояния моего меню. Вот фрагмент кода PlayState для тестирования:

public class PlayState extends FlxState
{
    override public function create():void
    {
        // ...
        add(new FlxButton(0, 0, "test"));
    }
}

и вот мое состояние меню:

import org.flixel.*;

public class stand_menu extends FlxState 
{
    public var ps:PlayState;
    public function stand_menu(PS:PlayState) 
    {
        ps = PS;
    }
    override public function create():void
    {
        FlxG.bgColor = 0xFFFFFFFF;
        var bttn:FlxButton = new FlxButton(10, 10, "add cash",add_cash);
        this.add(bttn);
        var bttn2:FlxButton = new FlxButton(10, 30, "go back",go_back);
        this.add(bttn2);
    }
    public function add_cash():void
    {
        ps.cash += 10;
    }
    public function go_back():void
    {
        FlxG.switchState(ps);
    }
}

1 ответ

Решение

Я не уверен, что государства должны использоваться таким образом.

если вы откроете, следуйте коду от FlxG.switchState(state), вы закончите в FlxGame.switchStateгде это происходит

protected function switchState():void
    { 
        //.... skipping some code here

        //The old state is officially destroyed
        if(_state != null)
            _state.destroy();

        //And actual state switching is done here. Note that _requestedState was set from FlxG.switch state
        _state = _requestedState;
        _state.create();
    }

Практически, когда вы меняете состояние, старое уничтожается. Поэтому FlxG.switchState() не предназначен для загрузки старых состояний, он будет работать только для новых. Обычно вы создаете новое состояние каждый раз, когда переключаетесь на него. например:

public static function quitToMainMenu():void {
        FlxG.switchState(new MainMenuState);
    }

Если вам нужно хранить вещи в состоянии и использовать их позже, не делайте этого. Поместите их в другой статический или одноэлементный класс, чтобы они не удалялись после изменения вашего состояния.

Другие вопросы по тегам