![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
|
Уважаемый All, я надеюсь, что предлагаемый материал поможет КАЖДОМУ
(т.е. не иолько новичкам) лучше ПОНИМАТЬ Flash и других флешеров. Особенно если у него сложилось впечатление, что Flash это совсем просто. Часть 1 Сначала предлагаю выполнить следующий набор действий(точно как написано), или очень внимательно следить за текстом (если доверяете автору): 1. Создаем новый мувик назовем его Grabli 2. Создаем новый символ - мувиклип Test и рисуем в нем к примеру квадрат 3. Возвращаемся к основной сцене и размещаем на ней в первом и пока единственном фрейме созданный символ и называем его, например, "aaa" 4. В ObjectActions для "aaa" пишем следующий скрипт: onClipEvent(load) { //actions when movie loaded _root.i += 1 this.j += 1 trace(this) trace("load: " + this._name + " frame: " + _root._currentframe + " _root.i: " + _root.i + " this.j: " + this.j) } onClipEvent(enterFrame) { //actions when enter frame loaded _root.i += 1 this.j += 1 trace(this) trace("enter: " + this._name + " frame: " + _root._currentframe + " _root.i: " + _root.i + " this.j: " + this.j) } --- Желательно оставить строчки комментария - так будет поучительнее 5. Тестируем мувик и в окошке Trace получаем следующий лог: _level0.aaa load: aaa frame: 1 _root.i: 1 this.j: 1 _level0.aaa enter: aaa frame: 1 _root.i: 2 this.j: 2 _level0.aaa enter: aaa frame: 1 _root.i: 3 this.j: 3 _level0.aaa enter: aaa frame: 1 _root.i: 4 this.j: 4 _level0.aaa enter: aaa frame: 1 _root.i: 5 this.j: 5 ................... Все о'кей - такой результат и предполагался А вот теперь внимательно ВНИМАТЕЛЬНО следите за руками: 6. На таймлайне основной сцены во втором фрейме создаем новый кейфрэйм (Insert>Keyframe) 7. В новом кейфраме выбираем расположенный в нем обьект-мувиклип (у меня это квадрат) называем его "bbb" и изменяем его положение и размеры. 8. Открываем окно ObjectActions и видим в нем скрипт такой-же как и для обьекта "aaa". НИЧЕГО в нем не меняя запускаем TestMovie И ... получаем удовольствие N1. На экране мы видим пульсирующий квадрат, а в окне Trace следующий лог: _level0.aaa load: aaa frame: 1 _root.i: 1 this.j: 1 _level0.aaa enter: aaa frame: 2 _root.i: 2 this.j: 2 _level0.aaa enter: aaa frame: 1 _root.i: 3 this.j: 3 _level0.aaa enter: aaa frame: 2 _root.i: 4 this.j: 4 _level0.aaa enter: aaa frame: 1 _root.i: 5 this.j: 5 _level0.aaa enter: aaa frame: 2 _root.i: 6 this.j: 6 _level0.aaa enter: aaa frame: 1 _root.i: 7 this.j: 7 _level0.aaa enter: aaa frame: 2 _root.i: 8 this.j: 8 _level0.aaa enter: aaa frame: 1 _root.i: 9 this.j: 9 ................... Оба-на?!! А ГДЕ обьект "bbb"??? В MovieExplorer он ЕСТЬ, а реально НЕТУ!!! Вместе со всеми своими бесценными переменными. ??? Теперь удвойте внимание - самое интересное 9. В ObjectActions для обьекта "bbb" вносим изменение, самое незаметное и минимальное, например, в строке комментариев заменяем одну маленькую "a" на большую "A". Вот так: ... { //Actions when movie loaded ... Можно просто добавить пробел в конце или начале любой строки. И снова тестируем: квадрат пульсирует точно также, а вот лог СОВСЕМ другой. Но прежде чем привести распечатку результатов хочу задать вопрос каким должен быть в данном случае размер файла SWF если мы просто изменили один символ комментария который ни на что не должна влиять - таким же, больше, меньше? Правильно, в данном случае файл SWF УВЕЛИЧИВАЕТСЯ почти В ДВА РАЗА (с 587 до 1082 байт). Понятно? НЕТ - тогда внимательно читай лог: _level0.aaa load: aaa frame: 1 _root.i: 1 this.j: 1 _level0.bbb load: bbb frame: 2 _root.i: 2 this.j: 1 _level0.aaa load: aaa frame: 1 _root.i: 3 this.j: 1 _level0.bbb load: bbb frame: 2 _root.i: 4 this.j: 1 _level0.aaa load: aaa frame: 1 _root.i: 5 this.j: 1 _level0.bbb load: bbb frame: 2 _root.i: 6 this.j: 1 _level0.aaa load: aaa frame: 1 _root.i: 7 this.j: 1 _level0.bbb load: bbb frame: 2 _root.i: 8 this.j: 1 _level0.aaa load: aaa frame: 1 _root.i: 9 this.j: 1 _level0.bbb load: bbb frame: 2 _root.i: 10 this.j: 1 ................... Обьект "bbb" наконец-то появился, НО от внутренних переменных (this.j) и обьекта "aaa" и обьекта "bbb" не остается ничего - при каждом load - все переменные заново инициализируются. Т.е. если вы решите установить какие-то переменные мувика в такой ситуации то проживут они не долго - до следующего события load. В таком маленьком примере это легко обнаружить, Но в крупных проектах с сотней-другой фреймов да и еще со сложной логикой это становится слегка затруднительным и не всегда однозначным. И наконец самое смешное или грустное, кому как больше нравится... Можно изменить название обьекта "bbb" на "aaa" и убедиться что данные по прежнему не сохраняются. Можно вернуть запись ObjectActions для обьекта "bbb" к исходному виду или наоборот в скрипте для обьекта "aaa" сделать ТОЧНО такие же изменения и посмотрите что получится. Надеюсь вы догадываетесь, что при этом произойдет, поэтому лог не привожу. Правильно - обьект "bbb" опять пропадет. Я игрался с такого рода изменениями достаточно долго чтобы утверждать что поведение в такой ситуации достаточно четко и стабильно. Возможно это особенность именно моего Flash, или только моего стиля работы, но мне почему-то так не кажется. Вспомните - вы делаете проект, случайно получаете описанную ситуацию вставляете какой-то trace() и все работает, затем перед самой сдачей удаляете trace() и все перестает работать. И медленно выпадаешь в мелкокристаллический осадок с криком "ПОЧЕМУ?"... И уж слишком часто на флэш-форумах возникают вопросы типа "не могу установить/считать переменные". Намного более чаще чем это можно было бы обьяснить только абсолюным нежеланием читать документацию. Очень часто сталкиваешься с ситуацией когда абсолютно правильные рекомендации почему-то не помогают, и не только потому, что ситуация не полностью описана. А явления "полтергейста" когда вчера работало а сегодня уже нет и ничего принципиально не менялось... Вот собственно и все - как этим материалов воспользоваться, решать вам самим, "Кто предупрежден - тот вооружен", но если позволите я попробую сформулировать некоторые размышления по этому поводу. Прежде всего хочу отметить что данная граблеобразная "особенность" Flash нигде в доступной мне документации даже не упоминается. Может быть это ноу-хау флэш-гуру. Во-вторых эту ситуацию можно большей частью избежать если следовать рекомендациям типа "Каждому мувиобьекту отдельный слой". Хотя я такую возможность честно говоря не исследовал, возможно что и там есть что-то схожее. В третьих нельзя абсолютно четко считать, что MovieExplorer отражает структуру скомпилированного SWF. И наконец надо как-то честно предупредить начинающий флэшеров что во флеше есть не только "конфетки" но и такого рода грабли. Хотелось бы составить этакий кодекс молодого строителя флэш-коммунизма: "Каждому мувиобьекту отдельный слой" "Таймлайны всех слоев равняйтесь" "Обьект - это не только его название, но и ...." "Время жизни переменных в обьекте не может быть длиннее жизни обьекта" и т.д. Список предлагаю продолжить. P.S. Все замечания к данному тексту прошу дублировать на apm@tut.by Best regards, APM |
![]() |
Часовой пояс GMT +4, время: 03:08. |
|
|
« Предыдущая тема | Следующая тема » |
|
|