2015-06-19 3 views
1

Это последние две строки сценария действия для моего кадра:eventListeners не оставит

removeListeners(); 
if(!stage.hasEventListener(Event.ENTER_FRAME)){trace("STAGE HAS NO eventListeners");} 

С removeListeners() функция было описано ранее, как:

function removeListeners(){ 
    if(button){ 
     button.removeEventListener(MouseEvent.CLICK,leaveGameScene);   
    } 
    stage.removeEventListener(Event.ENTER_FRAME,menuOnFrame); 
    stage.removeEventListener(Event.ENTER_FRAME,collectDrachmas); 
    stage.removeEventListener(Event.ENTER_FRAME,updateHealth); 
    stage.removeEventListener(Event.ENTER_FRAME,updateCards); 
    stage.removeEventListener(Event.ENTER_FRAME,updateQuestions); 
    stage.removeEventListener(Event.DEACTIVATE,stageDeactivate); 
    stage.removeEventListener(KeyboardEvent.KEY_DOWN,key_down); 
    stage.removeEventListener(KeyboardEvent.KEY_UP,key_up); 
    stage.removeEventListener(Event.ENTER_FRAME,charEnterFrame); 
    stage.removeEventListener(Event.ENTER_FRAME,updateInteractives); 
    stage.removeEventListener(Event.ENTER_FRAME,onFrameBadguy); 
    stage.removeEventListener(Event.ENTER_FRAME,onFrameStage); 
    stage.removeEventListener(Event.ENTER_FRAME,updateConversations); 
    stage.removeEventListener(Event.ENTER_FRAME,updatePit); 
    //etc etc etc 

} 

Таким образом, тщательно удаляя любые возможные существующие eventListeners, которые происходят во всем моем проекте. Мы знаем, что никакие eventListeners не добавляются несколько раз из-за причины, приведенной ниже, и потому что все существующие eventListeners завершаются этим кодом после выхода из фрейма.

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

stage.addEventListener(Event.ENTER_FRAME,updateHealth); 

Когда последние две строки сценария действий для моего кадра выполняется, Flash действует так, как будто там нет абсолютно никаких ENTER_FRAME eventListeners на сцене, калька упорно что

"STAGE HAS NO eventListeners"

соответственно. Однако после запуска кода в этом фрейме запускаются несколько event_FRAME eventListeners этапа, которые были объявлены в предыдущем кадре (это вызывает несколько ошибок, поскольку в настоящее время вызываются нулевые объекты)! Похоже, что eventListener не появляется ни от чего, ни от причины. Как это может быть возможным? Что может быть причиной этой проблемы?

Возможно, я должен упомянуть, что я использовал тот же метод с помощью кнопки, чтобы перейти к этому кадру без проблем. Оба пути заканчиваются:

removeListeners(); 
gotoAndPlay(1,"Menu"); 

Update

Вот ошибки, данные:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/collectDrachmas()[_109_fla.MainTimeline::frame1:369] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/updateHealth()[_109_fla.MainTimeline::frame1:417] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/updateQuestions()[_109_fla.MainTimeline::frame1:592] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/updateCards()[_109_fla.MainTimeline::frame1:810] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/charEnterFrame()[_109_fla.MainTimeline::frame1:978] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/updateInteractives()[_109_fla.MainTimeline::frame1:1892] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/onFrameBadguy()[_109_fla.MainTimeline::frame1:2015] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/onFrameStage()[_109_fla.MainTimeline::frame1:2638] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at _109_fla::MainTimeline/updateConversations()[_109_fla.MainTimeline::frame1:2760] 

Эти ошибки возникают из-за следующих eventListeners в своих соответствующих функций:

function collectDrachmas(e:Event) 
function updateHealth(e:Event) 
function updateCards(e:Event) 
function charEnterFrame(e:Event) 
function updateInteractives(e:Event) 
function onFrameBadguy(e:Event) 
function onFrameStage(e:Event) 
function updateConversations(e:Event) 
+2

Можете ли вы поделиться своей флорой, что было бы проще всего выяснить, что происходит. Я могу сказать вам, что было бы намного лучше, если бы один унифицированный прослушиватель ENTER_FRAME вместо дюжины или около того у вас был. – BadFeelingAboutThis

+3

OMG, почему вы добавляете так много слушателей? Вы должны сгруппировать всех этих обработчиков ENTER_FRAME в один. – null

+0

Должен ли я? Я объединю их все вместе и посмотрю, если это упростит ситуацию до – DrakeTruber

ответ

1

Я не мог получить идентификатор ea о вашей проблеме. Но вот мое понимание.

  1. этап - это глобальный объект. Поэтому везде, где бы вы ни добавляли eventlistener к этому объекту, он прослушивает один и тот же объект. Поэтому будьте осторожны.
  2. также использование другой функции для одного и того же события для одного и того же объекта - плохая идея.
  3. Enterframe - неприятная вещь в моем опыте.
  4. этап глобальный доступен для кода только после того, как экранный объект добавляется на сцену. Это означает, что если вы собираетесь использовать объект сцены внутри конструктора классов, наиболее вероятно, что он выдает нулевую ошибку. Это означает, что мы обращаемся к объекту, прежде чем он вам доступен. Поэтому в вашем случае вы можете попытаться получить доступ к объекту сцены, прежде чем он станет доступен вам.

Пожалуйста, поделитесь еще одним кодом, чтобы мы могли понять, что происходит. Тогда определенно мы могли бы помочь вам в этом.

+0

Ваша точка 2 - это то, что не понравилось и Бэтмен, который сохранил мой код. Я понятия не имею, почему это имеет значение, но, честно говоря, кто это волнует. Самая важная цель, которую мы пытаемся достичь, - заставить код делать то, что вы хотите, чтобы я был доволен. Вы первый ответили на этот вопрос, поэтому, полагаю, вы заслуживаете правильного ответа. – DrakeTruber