Я работаю над маленькой флеш-игрой. Игра содержит 20 уровней и главное меню. Переход между уровнями осуществляется путем удаления каждого объекта в кадре, а также всех прослушивателей событий. Затем код добавляет объекты следующего уровня ...Как автоматически удалить прослушиватель событий из объекта в AS3
Ловля и удаление слушателей событий осуществляется с помощью этого кода:
override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
{
super.addEventListener(type, listener, useCapture, priority, useWeakReference);
arrListeners.push({type:type, listener:listener});
}
private function clearEvents():void
{
for(var i:Number = 1; i<arrListeners.length; i++){
if(this.hasEventListener(arrListeners[i].type))
{
this.removeEventListener(arrListeners[i].type, arrListeners[i].listener);
}
}
arrListeners = []
}
Этот код отменяет внутренние addEventListeners и делает каждый слушатель будет добавлен в массив , Вторая функция проверяет, все ли существуют EventListeners (ранее не удалены), и просто удаляйте каждый Listener из массива.
Этот код отлично подходит для EventListeners, назначенных этапу. Однако, когда EventListener назначается непосредственно объекту, он не добавляется в массив, поэтому он не может быть удален автоматически позже.
Я знаю, что при удалении объекта также удаляются назначенные ему прослушиватели событий. Но когда я снова добавляю этот объект, Listeners запускаются дважды. Вы можете свободно перемещаться по уровням, чтобы вы могли идти туда и обратно. И когда ты возвращаешься, я получаю проблемы. Система чрезмерно используется и работает медленнее, потому что количество выполняемых прослушивателей событий удваивается.
Итак, можете ли вы изменить этот код или дать мне совет, как я могу поймать EventListeners, которые назначены Object и в конечном итоге удалить их.
Код:
package
{
Public Class Main extends MovieClip
{
Public function Main()
{
Intro();
}
Private function Intro():void
{
//Constructor contains a lot of addChild and a EventListeners. So I will upload what I think i important for this problem.
Play_btn.addEventListener(MouseEvent.CLICK, clicked);
function clicked (e:MouseEvent):void
{
clearEvents();
clearChild(); // function that removes all children on stage
FirstLevel();
}
}
Private function FirstLevel():void
{
//Also adding children and EventListeners, that affect the gameplay
Next_level_btn.addEventListener(MouseEvent.CLICK, clicked1);
function clicked1 (e:MouseEvent):void
{
clearEvents();
clearChild();
SecondLevel();
}
Main_Menu_btn.addEventListener(MouseEvent.CLICK, clicked1);
function clicked1 (e:MouseEvent):void
{
clearEvents();
clearChild();
Intro();
}
}
И так далее в течение следующих 20 уровней.
Спасибо за консультацию.
Непонимание вашего вопроса. В частности: «Этот код отлично подходит для EventListeners, которые не привязаны к объекту.Когда определенному EventListener назначается объект, он не добавляется к массиву, поэтому я не могу его удалить позже ». – BadFeelingAboutThis
Первая функция из кода, который я загрузил, только улавливает addEventListeners, которые добавляются по этому пути: - stage .addEventListener (Event.ENTER_FRAME, начал) или - addEventListener (Event.ENTER_FRAME, начало); Но когда я addEventListener, который присваивается объекту для Ex: - Start_btn.addEventListener (Mouse.CLICK, щелкнул) Код не улавливает и не помещает его в массив, а это значит, что я не могу удалить позже, используя вторую функцию – Stefan4024
, не уверен, как вы переопределяете функцию addEventListener на этапе? Ваш Start_btn (или wha tever) должен был бы наследовать класс, код которого вы показали. – BadFeelingAboutThis