AS3- Удаление дочерних элементов со сцены при смене сцены с помощью функции

В настоящее время я создаю игру, в которой игрок управляет космическим кораблем, который стреляет по вражеским кораблям. Я добавил в сцену таймер, чтобы через 60 секунд видеоклип «базового корабля» взорвался и исчез. Однако, когда это происходит, я хочу перейти к другой сцене как к сцене «завершенного уровня», но как только я меняю сцены, игра продолжается со мной и вроде как… продолжается. Вы все еще можете видеть летающих вокруг врагов, а это не то, чего я хочу. Я пытался (плохо себе представить) эту проблему и просто хочу знать, как я могу удалить эти функции из работы, поскольку добавленные мной RemoveEventListener не выполняют эту работу. Чтобы уточнить, я хотел бы знать, как удалить все дочерние элементы/прослушиватели событий и завершить все функции, когда я перейду к следующей сцене. (Это функция leveltimer, с которой у меня проблемы) Спасибо :)


person Nicholas Andrew Thompson    schedule 16.03.2015    source источник


Ответы (1)


В этом коде МНОГОго не хватает. Давайте разберем все ваши функции, чтобы увидеть, что происходит и почему что-то не работает.

Когда ваш таймер истечет, вы попытались удалить двух слушателей следующим образом:

removeEventListener(Event.ENTER_FRAME, addbEnemy);
removeEventListener(Event.ENTER_FRAME, onclick);

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

Что касается второго, onclick не принимает событие ENTER_FRAME. Требуется событие CLICK. Поэтому вам нужно изменить его на это, чтобы удалить события кликов: stage.removeEventListener(MouseEvent.CLICK, onclick);

Отлично, теперь вы больше не можете нажать, чтобы добавить пули. Но как насчет всего остального? Ну, вы еще не удалили слушателей, которые контролируют другие объекты. Вы можете начать с остановки всех ваших работающих таймеров.

tm.stop();
myTimer.stop();
tm.removeEventListener(TimerEvent.TIMER, onstart);
myTimer.removeEventListener(TimerEvent.TIMER, levelTimer);

Хорошо, теперь таймеры остановлены, поэтому новые враги не должны появляться, а корабль не взрывается каждые 60 секунд.
Что дальше? Герой все еще перемещается, поэтому удалите событие ENTER_FRAME, управляющее героем: removeEventListener(Event.ENTER_FRAME, onenter);

Последнее — все враги на экране.

К сожалению, я даже не вижу кода, который обрабатывает движение врага, в коде, который вы разместили. Я предполагаю, что их движение обрабатывается в классе enemy, поэтому вам нужно добавить функцию остановки в этот класс, а затем вызывать ее для каждого врага.

К сожалению, все ваши враги добавляются на сцену в пределах локальной области действия функции onstart(), поэтому вы потеряли к ним доступ. Есть два способа исправить это:

  1. Сделайте цикл по всем дочерним элементам на сцене и проверьте, является ли каждый из них врагом, и если да, вызовите созданную вами функцию остановки.
  2. В функции onstart() добавьте каждого врага в массив, чтобы сохранить доступ к нему. Затем в функции levelTimer() выполните цикл по каждому элементу массива и вызовите функцию остановки.
person Karmacon    schedule 16.03.2015
comment
@NicholasAndrewThompson Я согласен, массив - лучший способ сделать это. Удачи - person Karmacon; 16.03.2015