![]() |
|
||||||||||
|
|||||
|
Регистрация: 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 |
|
|||||
|
Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
|
Если предложенный выше материал не вызвал желания немедленно забросить
Flash как можно дальше, то разрешите мне добавить еще пару строчек для тех кто верит, что в любом случае Flash - это технология светлого будущего. (Кстати я тоже так считаю, и намерен это доказать в одной из следующих частей данного манускрипта.) А пока для тех кто не убоялся трудностей, пару пунктов на заметку как и где можно и нужно пользоваться данным материалом. Вот кусочек из переписки с человеком, с чьей подачи я собственно и занялся флэшем. Чуть-чутьвведу в курс дела. Задача была достаточно простой: ................. Корабль с подъемным краном. Мне нужно показать, что чем больше груз, тем сильнее наклон корабля. Причем, чтобы массой груза управлял пользователь при помощи движка. Движок перемещается вверх, груз увеличивается, корабль сильнее наклоняется. Если перейти за какую-то черту на движке, загорается красная лампочка. Это все... ................. Я сделал то что, просили плюс добавил качку корабля, раскачивание груза и оверкиль корабля при максимальном крене. Правда сделал всю анимацию програмными средствами, что вызвало замечание насчет не совсем разумного использования флэша и его возможностей. И вот ответ. ................. Ты конечно права - часть анимации можно и нужно делать стандартными средствами, а что-то можно сделать только програмными. Тут спорить не о чем. Дело вкуса и умений. ...... Но в данном случае, а возможно и всегда, есть кое-какие нюансы в том какой тип анимации выбрать и я постараюсь их пояснить. Кстати может быть после этого у тебя появится желание разобраться получше в том тексте, который я тебе присылал. (Грабли 1) Вот два примера из твоего мувика. Пример первый - пытаемся сделать качание корабля простой анимацией. Плюсы - просто делать и самое главное можно сделать более реальноую модель колебаний (разную скорость в разных фазах колебаний). Минусы - да вроде их нет, только нужно помнить что для колебания груза на стропе нужно компенсировать наклон корабля, а то он будет двигаться очень не естественно, так что програмный код какой-то все-таки потребуется. И вот тут-то появляется опасность тех самых граблей о которых я писал. Но пока только опасность. Чтобы она реализовалась нужна вторая составляющая этих граблей. А она появляется когда помимо колебания корабля появляется желание добавить и оверкиль корабля. Почему? Давай рассмотрим как ты это можешь сделать. Предполагаем что колебание корабля справа-налево выполнено в кадрах 1-10, а слева-направо в кадрах в кадрах 10-20 и в кадре 20 команда gotoAndPlay(1). Замечательно - качается. Теперь делаем оверкиль - естественно продолжить движение с кадра 20. Делаем перевот с кадра 21 - 40. Все грабли состоялись - теперь осталось только на них наступить. Что собственно мы сделали? А как ты сделала кадр 21? Естественно InsertKeyframe - и у тебя реально два разных мувика типа "корпус корабля с грузом" с одним названием и вообще никак не отличимых у них даже ObjectActions одни и теже. Соответственно Flash продолжает считать их одним и тем же обьектом и ты ничего не почувствуешь - все будет просто замечательно. Но только до тех пор пока ты не захочешь что-то подправить в ObjectActions мувика "корпус корабля с грузом" - мало ли что забыла или неправильно сразу сделать, или захочется подправить, например критический угол или еще что-то. И все ты получишь граблями по темечку. Почему - исправляя код ObjectActions мувика "корпус корабля с грузом" в keyframe 1, ты наверняка забудешь сделать ТОЧНО ТАКИЕ ЖЕ изменения в ObjectActions мувика "корпус корабля с грузом" в keyframe 21. Сответственно для флеша это становятся два разных обьекта и нигде он тебя об этом не предупредит, хотя весь мувик кардинально изменился. Был один обьект, а стало два. Каждый со своими собственными переменными и временем жизни. Что ты получишь в результате. При переходе к кадру 21 флэш не продолжит переворот, т.к. время жизни первого обьекта закончилось, а загрузит второй обьект, и при этом все внутренние переменные "корпуса корабля" и всех его внутренних обьектов! Так как графически это один и тот же сивол то ЗРИТЕЛЬНО, будет ощущение что переворот продолжается, НО как минимум положение груза изменится скачкообразно, так как его предыдущее положение не сохранилось. Возможно, что все будет не так страшно и даже незаметно, особенно если колебания груза были жестко засинхронизированы с колебаниями корабля, например в кратное число раз, или переменные хранились там где они гарантированно сохраняются, например в _root. Но на такую удачу рассчитывать не рекомендую. И дальше начинается головная боль - удаляешь исправления в коде - работает, вносишь снова - не работает. Исследуешь код под микроскопом - и ничего не понимаешь, так как ошибка в совсем другом. Пример второй - уже зная об этой особенности флеша я решил ей воспользоваться - приемом "обратить вред на пользу". Для того, чтобы начать мувик снова с исходной точки надо было не только перейти в кадр 1, но и восстановить ВСЕ переменные. Переменных много, их список менялся и мне было лень их все запоминать и восстанавливать. Я решил воспользоваться тем, что флеш сам перезагрузит обьекты и самостоятельно восстановит все переменные если их время жизни закончится. Для этого я специально в кадре 3 сделал InsertKeyFrame для корабля и регулятора. Для новой копии корабля я просто стер все ObjectActions рассчитывая, что ему все равно все действия ни к чему - он будет тут же удален, так как при переходе к кадру 1 будет загружена первая копия корабля с нужным кодом. Задача этой новой копии только инициализировать загрузку первой копии. Ну как - не слишком завернуто. Вот так я и сделал и... наступил на описанные грабли, но уже с другой стороны. Что происходило на экране, корабль переворачивается я нажимаю кнопку Repeat - корабль восстанавливается и ... тут же снова переворачивается. Почему не догадываешься? Правильно, обект регулятор не перезагрузился и сохранил все свои переменные. Исходно в ObjectActions регулятора не было ничего, нужно было хоть что-то записать чтобы обекты в кадрах 1 и 3 хоть чем-то отличались (размеры, окраска, и т.д. - все кроме кода отличиями не считаются). Нужно было хоть что-то добавить - пришлось добавить изменение цвета рукоятки. Если добавить абсолютно бесполезный код, то когда-нибудь появится искушение его удалить и ... грабли опять сработают. Ну вот пожалуй и все - надеюсь я не был слишком скушным и у тебя появилось понимание насколько важно продумывать мувик не только в целом, но и в деталях, особенно взаимодействие его отдельных частей. Во флеше слишком жестко действует правило, что целое это чуть больше чем сумма частей. .............. |
|
|||||
|
Регистрация: Oct 2001
Адрес: De, Ratingen
Сообщений: 63
|
Eshtshe nagljadnee, po-moemu, eta problema pri inicialisacii dinamicheskogo teksta, naprimer, sidjashtshego v Tween'e...
|
|
|||||
|
Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
|
RE: K_L
С твином придется разбираться – пока не готов. RE: All Видя почти полное отсутствие реакци можно сделать вывод, что все понятно и все согласны либо с точностью до наоборот. Тогда предлагаю любителям квестов новый флеш-квест: Простенький примерчик с LoadVariables: - делаем сцену с двумя слоями Actions и Text и двумя фреймами - делаем мувик(MyMovieText) в нем сивол с динамическим текстом (myText), - помещаем его в первый кадр слоя Text - добавляем в ObjectActions код onClipEvent(data) { this.myText = this.dataLoad } - в первый фрейм слоя Actions пишем loadVariables("data.txt","myMovieText") - во второй фрейм слоя Actions пишем stop() - делаем файл данных (data.txt) со следующим содержимым: dataLoad=blablalblablablablalbla Как вы думаете будет ли работать данный пример всегда – т.е. загружать переменные если после первого запуска в ObjectActions обьекта MyMovieText в первом фрейме слегка подправить код, например добавить комментарий. Вопрос оказывается непростой – если второй кадр в слое Text делался с помощью InsertFrame то гарантированно будет. А вот если с помощью InserKeyFrame – то … Если исходить из вышеприведенного текста, то можно сделать вывод ,что также гарантированно не будет. Но часто жизнь преподносит сюрпризы, оказывается, что может работать, но может и не работать, а может и работать и не работать, причем на одной и той же машине (но в разной конфигурации запущенных приложений). Материал по этим "граблям" я постараюсь выложить в понедельник. Но может быть кто-то пожелает разобраться самостоятельно. Было бы полезно сравнить впечатления. Это действительно интересно и поучительно. Можно было бы даже организовать конкурс – вопрос только в призовом фонде для победителей – кроме собственного времени потраченного на встречную задачу предложить нечего. Но может быть это кого-то заинтересует. Итак, время пошло. |
|
|||||
|
Регистрация: Jul 2002
Адрес: Днепропетровск, Украина
Сообщений: 7
|
2APM:
Эти грабли к Flash MX относятся? Потому что отсутствие объекта bbb мне воспроизвести не удалось - при создании keyframe сразу же появилась картина с load и потерей содержания внутреней переменной. (сорри всем за поднятие давней и возможно уже несправедливой темы, просто хочу разобраться) |
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
2APM
просто от удивления прочитал почти все (ну оооочнеь большие посты )...можно один совет ? не стоит настолько удивляться каждым граблям и тем более грузить ни в чем не повинных флэшеров ТАКИМ текстом с пространными объяснениями... я, например, сквозь него продрался с большим трудом - и то от нечего делать.это графоманством слегка отдает ![]() теперь насчет этих фишек: все просто. может не очевидно, но просто. > "грабли" первые: пятерка своеобразно относится к идентичности клипов. два последовательных кадра с одинаковыми символами и одинаковым кодом на них грузятся в линейку один раз. если ты заметил, то событие onClipEvent срабатывает только единожды... это значит что флэш считает клипы идентичными и грузит их только один раз. любое отступление от идентичности - и загрузка происходит два раза - все работает. при этом ни твининг (изменение скейла например) ни изменение имени не помогает - идентичность не нарушается (что впрочем вполне логично). это еще с натяжкой можно назвать граблями - но совсем не феноменальными, а самыми обычными, для песочницы причем в МХ такого не существует. все работает "правильно". ![]() > грабли вторые: может пришлешь примерчик где у тебя ТАК не работает onClipEvent(data) ? мне такое что-то не встречалось... > про "корабль с грузом" и тамошние грабли не прочитал... уж извини, но это нечитабельно абсолютно. ты можешь в трех фразах объяснить на какие грабли ты там встал ? Последний раз редактировалось Nox Noctis; 24.07.2002 в 18:37. |
|
|||||
|
Nox, ты обращаешься к человеку как будто он еще существует:)))) Последнее сообщение - 14.12.2001:))
|
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
блин !
всех убью Notna какого черта откапывать такую ЛАЖУ, да еще оооочень старую... черт... я целых 15 минут потратил на общение с привидением ![]() |
|
|||||
|
Регистрация: Aug 2001
Адрес: vg
Сообщений: 352
|
2 notna поделись методикой откапывания
![]() |
![]() |
Часовой пояс GMT +4, время: 06:05. |
|
|
« Предыдущая тема | Следующая тема » |
|
|