Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 15.10.2001, 21:01
APM вне форума Посмотреть профиль Найти все сообщения от APM
  № 1  
APM

Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
Attention Ахтунг - Грабли 1

Уважаемый 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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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