Используя переключатели для управления состоянием


Я пишу мою собственную маленькую пулю шутер в стиле Тохо. Пока все работает нормально, но мне не нравится некоторые аспекты моего кода. Воспользоваться этой функцией для показа и unshowing титульном экране:

    private function runIntro() : void
    {
        if (introFadeInTitle_ && aliceIntroTxt.alpha < 1)
            aliceIntroTxt.alpha += 0.02;
        else if (introFadeInTitle_)
        {
            var timer : Timer = new Timer(1000);
            timer.addEventListener(TimerEvent.TIMER, function() {
                timer.stop();

                introFadeInBtns_  = true;
            });
            timer.start();

            introFadeInTitle_ = false;
        } 
        else if (introFadeInBtns_ && startBtn.alpha < 1)
        {
            startBtn.alpha   += 0.02;
            optionsBtn.alpha += 0.02;
        }
        else if (introFadeInBtns_)
        {
            introFadeInBtns_ = false;

            gameState = GameState.READY;
        }

        if (introFadeOutBtns_ && startBtn.alpha > 0)
        {
            startBtn.alpha   -= 0.02;
            optionsBtn.alpha -= 0.02;
        }
        else if (introFadeOutBtns_)
        {
            var timer : Timer = new Timer(500);
            timer.addEventListener(TimerEvent.TIMER, function() {
                timer.stop();

                introFadeOutTitle_ = true;
            });
            timer.start();

            introFadeOutBtns_ = false;
        }
        else if (introFadeOutTitle_ && aliceIntroTxt.alpha > 0)
            aliceIntroTxt.alpha -= 0.02;
        else if (introFadeOutTitle_)
        {
            var timer : Timer = new Timer(500);
            timer.addEventListener(TimerEvent.TIMER, function() {
                timer.stop();

                introFadeOutBg_ = true;
            });
            timer.start();

            introFadeOutTitle_ = false;
        } 
        else if (introFadeOutBg_ && introBg.alpha > 0)
            introBg.alpha -= 0.02;
        else if (introFadeOutBg_)
        {
            introFadeOutBg_;

            gameState = GameState.RUNNING;
        }
    }

На первый взгляд, это просто куча если-иначе-если заявления, которые проверить, является ли данный объект тухнут и каково текущее состояние анимации. Я чувствую, что это если-иначе-если цепь в порядке за довольно короткое функции, как это, но у меня сложнее заявляет, что я хочу показать (например, готов-иди всплеск перед боем начинается), что бы просто шар такой структуры в жутком беспорядке.

Что является лучшим способом справиться с этим кодом?



289
4
задан 11 ноября 2011 в 03:11 Источник Поделиться
Комментарии
2 ответа

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

...
else if (state == FADE_INT_ASDF) {
state = CODE_OF_NEXT_STATE;
gameState = GameState.READY;
}
...

Если логика была сложнее, он будет стоить осуществлении государственного образца.


Если переключатели были заменены на перечисление/строковые константы можно создать новое значение SetTimer функция, которая может удалить некоторое дублирование кода:

private function setTimer(int timeout, IntroState/String newState) : void {
var timer : Timer = new Timer(timeout);
timer.addEventListener(TimerEvent.TIMER, function() {
timer.stop();
state = newState;
});
timer.start();
}

8
ответ дан 11 ноября 2011 в 09:11 Источник Поделиться

Начните с простого повторного факторинга.

1) Создайте класс с именем stateclass с introFadeInTitle_ переменных , aliceIntroTxt , introFadeInBtns_ , startBtn и т. д. Установить переменные этого класса со значениями

2) вместо проверки и установки свойств в runIntro , скрывать сложностей в функции класса и использовать эти функции. Помните, чтобы дать функциям осмысленные имена, так что поток кода понятно.

3
ответ дан 11 ноября 2011 в 05:11 Источник Поделиться