В настоящее время я создаю игру, в которой игрок управляет космическим кораблем, который стреляет по вражеским кораблям. Я добавил в сцену таймер, чтобы через 60 секунд видеоклип «базового корабля» взорвался и исчез. Однако, когда это происходит, я хочу перейти к другой сцене как к сцене «завершенного уровня», но как только я меняю сцены, игра продолжается со мной и вроде как… продолжается. Вы все еще можете видеть летающих вокруг врагов, а это не то, чего я хочу. Я пытался (плохо себе представить) эту проблему и просто хочу знать, как я могу удалить эти функции из работы, поскольку добавленные мной RemoveEventListener не выполняют эту работу. Чтобы уточнить, я хотел бы знать, как удалить все дочерние элементы/прослушиватели событий и завершить все функции, когда я перейду к следующей сцене. (Это функция leveltimer, с которой у меня проблемы) Спасибо :)
AS3- Удаление дочерних элементов со сцены при смене сцены с помощью функции
Ответы (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()
, поэтому вы потеряли к ним доступ. Есть два способа исправить это:
- Сделайте цикл по всем дочерним элементам на сцене и проверьте, является ли каждый из них врагом, и если да, вызовите созданную вами функцию остановки.
- В функции
onstart()
добавьте каждого врага в массив, чтобы сохранить доступ к нему. Затем в функцииlevelTimer()
выполните цикл по каждому элементу массива и вызовите функцию остановки.