Создание игровой платформы, нужен метод, чтобы остановить работу - PullRequest
0 голосов
/ 14 марта 2012

Я делаю платформенную игру во флэш-памяти.

У меня есть класс цели (класс, который содержит код для спрайта цели, где при попадании он переходит к следующей части игры).

В конструкторе целей добавлены 2 прослушивателя событий, они выглядят следующим образом:

addEventListener(Event.ADDED, beginClass);
addEventListener(Event.ENTER_FRAME, eFrame);

Функция beginClass в порядке и выполняется только один раз, но eFrame проверяет, есть ли у игрокапоразить цель, поэтому она постоянно работает.Проблема в том, что, как только игрок достигает цели, eFrame продолжает работать, находясь в меню, описывающем следующую сцену для игрока.Моя функция eFrame ниже.

    private function eFrame(event:Event):void{
        if(hitTestObject(_root.mcMain)){
            var lastScore:int = _root.mainScore;
            _root.mainScore = lastScore;
            while (_root.lvlHolder.numChildren > 0) {
                    _root.lvlHolder.removeChildAt(0);
            }
            _root.mcMain.removeChildAt(0);
            _root.isInCut = true;
            if (_root.lvlCurrent == 1) {
                _root.gotoAndStop(2);
            } else if (_root.lvlCurrent == 2) {
                _root.gotoAndStop(3);
            } else if (_root.lvlCurrent == 3) {
                _root.gotoAndStop(4);
            }
        }
    }

Кадры 2, 3, 4 - это кадры, содержащие только текст и кнопку, которые отображают сообщение для игрока, а затем игрок продолжает нажимать.Моя проблема в том, что eFrame все еще пытается быть запущенным, но класс не был создан, а метод вызывает крайнюю задержку, когда игрок продолжает.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Внутри цели, какой смысл _root?

В любом случае вот что я сделал: Измените событие ADDED на ADDED_TO_STAGE, чтобы при возникновении события мы знали, что у этого спрайта есть свойство stage.

addEventListener(Event.ADDED_TO_STAGE, beginClass);

Удалите событие eFrame из конструктора. Добавьте его к beginClass, с stage, вот так:

stage.addEventListener(Event.ENTER_FRAME, eFrame);

Теперь в eFrame вы можете просто удалить событие со ссылкой на сцену. Раньше он не работал, потому что ссылка была неправильной (что бы это ни было с переменной _root).

stage.removeEventListener(Event.ENTER_FRAME, eFrame);

НО - не забудьте сделать это перед этой частью вашего кода:

while (_root.lvlHolder.numChildren > 0) {
    _root.lvlHolder.removeChildAt(0);
}

потому что после удаления спрайта у него больше не будет свойства stage. Просто помните, чтобы очистить события во всех возможных сценариях. Я не совсем уверен, что stage - правильное место для размещения события ввода фрейма, я просто предположил это из-за того, что вы ранее называли _root.

0 голосов
/ 14 марта 2012

вы добавляете eventListener на сцену, поэтому попробуйте это:

stage.removeEventListener(Event.ENTER_FRAME, eFrame);

или

parent.removeEventListener(Event.ENTER_FRAME, eFrame);

или

event.target.removeEventListener(Event.ENTER_FRAME, eFrame);
0 голосов
/ 14 марта 2012

Внутри eFrame () остановите прослушиватель событий:

removeEventListener (Event.ENTER_FRAME, eFrame);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...