Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Инициализация компонента на таймлайн (http://www.flasher.ru/forum/showthread.php?t=122840)

Anddrey 19.03.2009 12:52

Инициализация компонента на таймлайн
 
Есть мувклип с несколькими ключевыми кадрами.Этот мувклип связан с классом.В первом кадре клипа стоит stop().Во втором лежит стандартный компонент.Его надо проинициализировать,повесить обработчики.После появления клипа на сцене и переходу к кадру с клипом.Обработчики компонента не работают.Если этот компонент положить в первый кадр - все нормально.Т.е. проблема в том что компонент нельзя проинициализировать если он лежит не в первом кадре.Как обойти проблему?

ladon 19.03.2009 12:57

Может положить компонент на первый кадр, но например под маску или за пределы отображаемой области и проинициализировать как надо, а на втором кадре убрать маску или выставить правильные координаты? :)

Anddrey 19.03.2009 13:00

Это выход,но не удобно при дизайне.Компонент перекрывает остальные элементы из 1-го кадра.Должен быть какой то програмный способ .Я забыл как это делается.Давно флеш брал в руки

litebox 19.03.2009 13:08

можно использовать событие
Код AS3:

addEventListener(Event.ADDED, eventComponentAdded);

оно будет срабатывать каждый раз, когда произошло изменение кадра и содержимое добавлено.
еще вариант, делать во втором кадре dispatchEvent своего события, например COMPONENT_ADDED, в классе подписаться на это событие и определить функцию, которая будет инициализировать компонент

Anddrey 19.03.2009 13:19

Интересно получается Если в класс отвечающий за мувклип добавить обработку Event.ADDED то события компонента из 2-го кадра отрабатываются но при этом возникает ошибка:TypeError: Error #1009: Cannot access a property or method of a null object reference. !!!

Добавлено через 3 минуты
Вообще это как то не "по людски".Если компонент находится в мувклипе то почему его нельзя проинициализировать если он не в первом кадре?Ведь когда мы кладем его из библиотеки на сцену то этим мы говорим системе(флешу) о присутствие экземпляра.Почему тогда его нельзя инициализировать?

litebox 19.03.2009 13:38

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

Anddrey 19.03.2009 14:03

Выходит что добраться до компонента из 2-го кадра при текущем первой никак нельзя пока этот компонент не отобразиться на сцене,так?Может есть какой то способ получения ссылки на него не отображая 2-й кадр?

Gaen 19.03.2009 14:36

Цитата:

Если компонент находится в мувклипе то почему его нельзя проинициализировать если он не в первом кадре?
Это всё в вашем воображении :)

На самом деле компонент появляется в мувиклипе в тот момент, когда мувиклип переходит на кадр с этим компонентом - без этого вы до него никак не достучитесь.

Anddrey 19.03.2009 14:46

Цитата:

Сообщение от GAIKER (Сообщение 806879)
Это всё в вашем воображении :)

На самом деле компонент появляется в мувиклипе в тот момент, когда мувиклип переходит на кадр с этим компонентом - без этого вы до него никак не достучитесь.

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

Добавлено через 33 минуты
Вот код на скорую руку:
1-й кадр две кнопки (b_1,b2)+stop() на кадре
2-й кадр два компонента(comp,res)
Код AS3:

package 
{
import flash.display.MovieClip;
import flash.display.SimpleButton;
import fl.controls.Label;
import fl.controls.NumericStepper;
 
import flash.events.Event;
import flash.events.MouseEvent;
 
public class  Comp_2 extends MovieClip  {       
        public function  Comp_2() {       
                initEvents();
                //initParams();
        }       
        protected  function initEvents() {
                b_1.addEventListener(MouseEvent.CLICK,onClickB1);
                b_2.addEventListener(MouseEvent.CLICK,onClickB2);
                addEventListener(Event.ADDED, eventComponentAdded);
        }
        private function eventComponentAdded(e:Event) {
                trace("eventComponentAdded="+e.target.name);
                if (e.target.name=="cmp") {initParams();}
        }
    protected  function initParams() {
                cmp.addEventListener(Event.CHANGE, onChangeCmp);
        }
        protected function onClickB1(e:Event):void {
                gotoAndStop(1);
    }
        protected function onClickB2(e:Event):void {
                gotoAndStop(2);
    }
        protected function onChangeCmp(e:Event):void {
                res.text="Результат работы компонента:"+cmp.value;
    }
}
}

Где нужно вызвать initParams что бы срабатывал метод onChangeCmp -вот в чем вопрос

Arif flasher 19.03.2009 15:27

Цитата:

Сообщение от Anddrey (Сообщение 806835)
Это выход,но не удобно при дизайне.Компонент перекрывает остальные элементы из 1-го кадра.Должен быть какой то програмный способ .Я забыл как это делается.Давно флеш брал в руки

можно их visible сделать фалс а визибл компонента тру. На каждый кейфрейм своя функция, ты не сможешь написать функцию на первом кадре для обьекта который находится на втором.


Часовой пояс GMT +4, время: 02:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.