На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: PIL
  
> Error 1009 при переходе на другой кейфрэйм
    Добрый день!
    Есть несколько кейфрэймов, переход между ними организован по нажатию кнопок: нажали - gotoandPlay(n)
    При переходе с первого кадра на любой другой все хорошо, но если скажем с пятого я захочу перейти на четвертый, то переход происходит, но выдается ошибка:

    TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

    и далее ноль реакции на любые действия.

    Как это побороть?

    З.Ы. если кнопка выполняет любое другое действие - все нормально, проблема только в переходах от фрейма к фрейму.
      Наверное без проекта или диаграммы хотя бы будет сложно понять. Одно совершенно точно, кто-то теряет ссылку на объект. А вот причину в слепую наверное не установить.
        piksel, говоря проще, на 1 кадре следующий код:
        ExpandedWrap disabled
          mybut_1.addEventListener(MouseEvent.CLICK,fun1);
           
          function fun1(event:MouseEvent):void{
              gotoAndPlay(5);
          }

        работает нормально.

        На остальных кадрах тот же код вываливается с ошибкой TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

        mybut_1 - уникальный идентификатор кнопки, присутствующей на кадре.
          мда, фреймы и слушатели в одном флаконе = утечка памяти, и 1009е во все поля. В общем, после перехода с первого фрейма mybut_1 становится null, и получаешь 1009.
            Vesper, понимаю, но как тогда организовать несколько меню? На ум приходит только сделать буферный мувиклип в первом фрейме и уже в нем осуществлять все переходы. Сейчас попробую, поможет ли это.

            А есть еще варианты, как это делается?
              Я по жизни делаю спрайтами (класс Sprite - умеет всё, что умеет мувиклип, минус фреймы и динамические параметры). Плюс в том, что в спрайтах ты полностью контролируешь жизненный цикл объекта-самого спрайта и всего содержимого, а в мувиклипах переход на другой фрейм убивает все ссылки в предыдущем фрейме, и всё хранить придется через проперти класса. Одно меню - один спрайт. На спрайте нарисованы кнопочки (тоже спрайты), на кнопочках слушатели, если меню предполагается вызывать откуда-нибудь с нескольких мест, пишу в классе устанавливаемые callback-параметры типа Function, которые вызываются при нажатии соответствующей кнопки. Не самое оптимальное решение, но до фреймворков я ещё не дорос. Пример:
              ExpandedWrap disabled
                class SampleOkCancel extends Sprite {
                    public var okCallback:Function=null;
                    public var cancelCallback:Function=null; // или через проперти
                    // всякие там кнопки, конструктор, расстановки итд итп
                    private function okClick(e:MouseEvent):void {
                        if (this.parent) this.parent.removeChild(this); // убираем себя с экрана
                        if (okCallback) okCallback();
                    }
                    private function cancelClick(e:MouseEvent):void {
                        if (this.parent) this.parent.removeChild(this); // убираем себя с экрана
                        if (cancelCallback) cancelCallback();
                    }
                }
              Для полноты картины нужно написать постановку слабых слушателей в кнопках, чтобы можно было собрать забытое окно через GC. "okButton.addEventListener(MouseEvent.CLICK,okClick,false,0,true)"
                Vesper, если делать через спрайты, то размещение всех объектов осуществляется программно? Значит к визуальному редактору прибегаем только для того, чтобы отрисовать тот или иной объект, а затем вызвать его в коде?

                Прошу прощения за нубские вопросы...
                  Goshanello, нет, не обязательно программно. Я просто пишу в FlashDevelop, в ней нет гуя для размещения объектов. В принципе вместо спрайта подойдет и обычный movieclip, если у него будет один кейфрейм. В этом случае (хотя зависит от реализации - здесь для меня темно) gotoAndStop() не должен вызывать уничтожение текущего фрейма, так как больше некуда переходить.

                  Но можно и так - что-то нарисовать, а потом вызвать в коде и повесить на спрайт. В этом случае желательно, чтобы нарисованный объект не имел кода и привязок, кроме тех, которые сами потом в коде приделаем.
                    Vesper, спасибо, буду пробовать!
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0235 ]   [ 16 queries used ]   [ Generated: 28.03.24, 07:59 GMT ]