Ошибка массива списка событий кнопки Flash AS3 - PullRequest
2 голосов
/ 11 июня 2010

я впервые публикую здесь вопрос.

У меня есть массив из 12 кнопок на временной шкале, который при первом посещении этой части временной шкалы добавляет к ним список событий CLICK, используя цикл for.,Все они прекрасно работают в этот момент.

Когда вы щелкаете один из них, он воспроизводит метку кадра внутри определенного мувиклипа и открывает биографию соответствующего человека с помощью кнопки закрытия и удаляет списки событий CLICK для каждой кнопки, снова используя цикл for.Кнопка закрытия воспроизводит анимацию закрытия, а затем временная шкала возвращается к первому кадру (тот, что содержит 12 кнопок), и повторно добавляются списки событий CLICK, но теперь работают только первые 9 кнопок массива.Нет ошибок вывода, и код для повторного добавления списков событий точно такой же, как в первый раз, когда работает.Я в полном недоумении и мне интересно, сталкивался ли кто-нибудь еще с этой проблемой.

Все мои кнопки названы правильно, нет абсолютно никаких ошибок вывода (я использовал модуль отладки), и я убедился, что массив с кнопками в нем выводит все 12 в данный момент кнопку закрытиящелкают, чтобы добавить списки событий обратно.

    for (var q = 0; q < ackBoDBtnArray.length; q++){
        contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[q]].addEventListener(MouseEvent.CLICK, showBio);
    }

    private function showBio(eo:MouseEvent):void {
        trace("show the bio");
        bodVar = ackBoDBtnArray.getIndex(eo.target.name);
        contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDPgArray[bodVar]);
        contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.addEventListener(MouseEvent.CLICK, hideBio);
        for (var r = 0; r < ackBoDBtnArray.length; r++){
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].mouseEnabled = false;
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].removeEventListener(MouseEvent.CLICK, showBio);
        }
    }
    private function hideBio(eo:MouseEvent):void {
        trace("hide it!");
        contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.removeEventListener(MouseEvent.CLICK, hideBio);
        contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDClosePgArray[bodVar]);
        for (var s = 0; s < ackBoDBtnArray.length; s++){
            trace(ackBoDBtnArray[s]);
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].mouseEnabled = true;
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].addEventListener(MouseEvent.CLICK, showBio);
        }

Заранее благодарен за любую помощь и понимание, которые вы можете предоставить ... У меня небольшое ощущение, что это то, что может быть очевидно для другого набора глаз ...haha.

Ответы [ 2 ]

0 голосов
/ 14 июня 2010

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

0 голосов
/ 12 июня 2010

Что-то, что мне кажется подозрительным, это то, что вы удаляете прослушиватель событий из closeBio_btn в начале hideBio (). Попробуйте поместить эту строку после цикла for.

У меня проблемы с оправданием этой догадки, но мне пришла в голову пара диких теорий:

  1. Это состояние гонки. Вы удаляете прослушиватель обработчика изнутри самого обработчика, и, поскольку обработчик был добавлен динамически, среда выполнения помечает обработчик для сборки мусора. При следующем сканировании обработчик удаляется, но, поскольку gotoAndPlay, вероятно, занимает незначительное количество времени, обработчик все еще находится в цикле for, добавляя обработчики щелчков, когда его убивают, и добавляет только первые 9 к этому моменту.
  2. Это проблема повреждения данных. Поскольку кнопка скрытия и массив из 12 кнопок, по крайней мере, тангенциально связаны через BoD_mc, среда выполнения выполняет странную оптимизацию за кулисами, что делает доступ к элементам через Bod_mc [с индексами] ненадежным после касания closeBio_btn.

Это интересная проблема, надеюсь, вы найдете решение :)

...