|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Nov 2008
Сообщений: 14
|
Нубские вопросы (адресация объектов, frame script)
Увы, я нуб, но хочу перестать, поможите кто может.
(0. FAQ прочитал) 1. Как обратиться из одного объекта в другой, иначе, как через события или общий контейнер? Банальный пример - в фильме два клипа, один должен рулить другим. Есть в основном фильме два клипа один с овалом, имя oo, класс code.oval второй с прямоугольником, имя bb, класс code.box Файлы: box.as: package code { import flash.display.MovieClip; public class box extends MovieClip { public function box() { trace ("box " + this); } } } oval.as: package code { import flash.display.MovieClip; import flash.events.*; public class oval extends MovieClip { public function oval() { trace ("oval " + this); addEventListener(Event.ENTER_FRAME, refresh); } public function refresh(e: Event) { trace ("oval oEF!"); trace (this); trace (this.parent); // trace (this.parent.bb); } } } 2. Чем так плох код в кадре? Какая ему адекватная замена? Все высказывают постулат, мне бы очень хотелось иметь объяснение логики. 3. Можно ли загрузить внешний swf, чтобы он был экземпляром некоего класса? (в AS2 нельзя, приходилось иметь объект-описание класса и в него, в чайлд, грузить swf как контент. В AS3 так же?) 4. Есть ли возможность грузить swf и потом дубрировать/аттачить? (Да-да-да, в FAQ написано, что нет - я и сем знаю - но не изменилось ли это в AS3?) Спасибо! |
|
|||||
Регистрация: Jul 2007
Адрес: Дубна, Моск.обл.
Сообщений: 108
|
1. Потому что в классе-родителе нет свойства bb, надо либо сделать класс oval динамическим:
либо, что еще лучше, написать так: 2. Объектно-ориентированное программирование - классы. 3,4 - с этим пока не работал. |
|
|||||
Регистрация: Nov 2008
Сообщений: 14
|
1. Первое не помогло, второе - да, но отчего такой геморрой? Уже ли в as3 нет единого сквозного древа родителей-детей?
2. Это понятно, но - какова замена? Положим, мне требуется выполнить некий код синхронно с анимацией. Что, по enterFrame ловить номер кадра и обрабатывать? Это гораздо менее экономично, чем привязать код к событию достижения кадра. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
0. Кто вас так научил называть классы? Хелп — врядли. Если это наследие тяжелого сишного прошлого, то надо срочно ликвидировать последствия;
1. А почему у вас клипы на одном уровне вложенности общаются друг с другом? 2. Децентрализация и сегментированность кода. На замену — addFrameScript; 3. Можно, Document class клипа и есть класс этого клипа; 4. Экземпляры классов — без проблем. Последний раз редактировалось etc; 06.11.2008 в 00:26. |
|
|||||
strange mood
|
Код в кадрах - это не вселенское зло, которого нужно избегать любой ценой. Он нужен именно тогда, когда требуется выполнить какое-то действие в привязке к анимации. У меня обычно дело ограничивается остановкой воспроизведения и посылкой события мол такое-то состояние достигнуто.
Чего действительно не следует делать - так это пихать в кадры всю логику приложения. Геморрой с детьми происходит во-первых из-за строгой типизации и того факта что класс MovieClip не является динамическим, что не позволяет навешивать на него новые свойства во время выполнения, и это даёт прирост производительности. А ещё это хорошо с точки зрения инкапсуляции: прячется всё, что только можно. Например если взять некий мувик test, у которого в классе прописано то через test.mc мы наш объявленный мувик достать не сможем, потому что он умышленно скрыт от посторонних. Тут помогут только обходные методы типа getChildByName или getChildAt В AS3 так заведено, что если кому-то нужно дать доступ к мувику/спрайту, то нужно передать на него ссылку. Потому что чем меньше переменных "видит" каждый отдельный блок кода, тем более независимым он является и тем легче он изменяется и отлаживается.
__________________
тонкий тролль, осеянный благодатью |
|
|||||
Регистрация: Nov 2008
Сообщений: 14
|
__etc
0. Не только сишное, но и очень давнее, увы... 1. Да вот надо им, по задаче. В конце концов, в flash проектах это сплошь и рядом (ну, лично в моей практике). Ну вот пример навскидку. Делаем игру. Есть движок игры - класс с весьма разухабистой логикой, есть GUI. При каких-то действиях пользователя, переключаемся на ракеты. По старинке это делало бы так: _root.mainGUI.weaponViewer.gotoAndStop("rockets"). Ясное дело, что это все можно сделать на вызове функции класса GUI (хотья опять-же, надо прописать путь к экземпляру класса, реализующего GUI), прикрутить сюда какой-нибудь as broadcaster и пр., но это все выглядит как атомный реактор на рыбацкой джонке. Я уж не буду говорить за баннеры, которые сегодня еще можно делать на as2, ссылаясь на соответствие инструментария решаемой задаче, но вот через пару лет это будет выглядеть уже отмазкой. 2. Ага, значит есть приемчик. Ок, спасибо. 3. эээ... Еще раз - в main.swf я загружаю test.swf, у которого (когда он делался) в doc class вписан нужный мне функционал? И если у меня таких подгружаемых файлов должно быть 200, то помимо визуалки я буду 200 раз прокачивать одинаковую логику? Если это единственный вариант, видимо, буду действовать по старинке. 4. Ага. А какую команду почитать, не сочтите за назойливость? GAIKER Ну, собственно, именно это мне и надо, я не собираюсь писать ту мач много кода, просто идеологически код в кадре - органически вытекает из анимационной направленности Flash, и жуткий строгий запрет и замечание Дембицкого насчет мышления, испорченного символьной логикой (цитата по памяти ) произвели на меня тяжелое впечатление. Например, у Мука расписано, что такое frame script, и все на этом - ни что хорошо, ни что плохо, вроде бы не изложено. Правильно ли я понял, что getChildByName или getChildAt позволяют получить доступ к приватным данным? Если это так, то впору объявлять траур... В AS2 безопасность данных также носила чисто имитационно-украшательский характер... Последний раз редактировалось AS3noob; 06.11.2008 в 04:16. |
|
|||||
Регистрация: Jun 2007
Сообщений: 374
|
AS3noob,
Цитата:
|
|
|||||
Регистрация: Nov 2008
Сообщений: 14
|
s8000_1
Ммммда... Вот как раз эту идею я воспринимаю как прицеп к майбаху. Если у меня есть функционал GUI, сепаратно описанный от других в классе, и функционал основного приложения, столь же автономный, то связывать это все через некий "надведомственный клип" мне кажется неестественным. Ничуть не изящней, чем прямое воздействие в духе AS1. В этом аспекте, даже широковещательная связь, вроде asБroadcaster, кажется мне более разумной. Не говоря уж того, что я в упор не понимаю, почему (и зачем) нет возможности связываться с другой ветвью иерархического древа объектов фильма, тогда как связь "прямо вверх" и "прямо вниз" работает без проблем, при очевидном существовании самого древа. Разумеется, при учете защиты данных - приватов и пр. Конечно, если "здесь так принято", то против брандспойта не попрешь, но очень приятно, когда тебя не заставляют, а уговаривают и логично обосновывают необходимость тех или иных телодвижений, тем более в таком формализуемом и логичном деле, как программирование. Это я, разумеется, не про вас, а про адобовцев. Запутаться же можно в любом приложении, ключ - комментарии. Например, при описанном подходе, doc class будет связывать между собой кучу разных процессов, и бардак в нем будет не меньший, чем в большом приложении, написанном процедурно-ориентированным методом. Если продолжить пример с игрой, то воздействий в обе стороны между игрой и гуём может быть несколько десятков, многие из которых смехотворны, но интенсивны, типа вывода числа в текстовое поле (score, ammo, health, reload etc). Тот же самый объект-вещатель (равно как и цель воздействия) в одной области фильма есть, в другой нет, и как быть, привязывать листнера, которого нет, к событию, которое тоже пока не описано? Почитаю пейджер, много подумаю... Так или иначе, спасибо за совет. Последний раз редактировалось AS3noob; 06.11.2008 в 10:23. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
1. Это неправильная организация, а то, что сплошь и рядом — печально. Вам необходимо использовать MVC, тогда и всяческих _root.bla-bla-bla.gotoAndStop в жизни не будет;
3. Используйте композицию тогда; 4. new. s8000_1, клипы на одном уровне вложенности вообще общаться друг с другом не должны, это не есть правильно. AS3noob, пишите контроллер интерфейса, получайте события от кнопок в GUI, изменяйте модель, а интерфейс сам подстроится под модель. Это есть правильно и не создает никаких проблем в реализации. |
|
|||||
Регистрация: Jun 2007
Сообщений: 374
|
__etc, ну я правильно понимаю?
[IMG]http://pic.************/uploads/081106/ItpGogdwrd.png[/IMG] |
Часовой пояс GMT +4, время: 20:54. |
|
« Предыдущая тема | Следующая тема » |
|
|