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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

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

Регистрация: 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); 
		}

	}
}
Закомментаренная строка trace (this.parent.bb); дает ошибку. ЧОМУ???

2. Чем так плох код в кадре? Какая ему адекватная замена? Все высказывают постулат, мне бы очень хотелось иметь объяснение логики.

3. Можно ли загрузить внешний swf, чтобы он был экземпляром некоего класса? (в AS2 нельзя, приходилось иметь объект-описание класса и в него, в чайлд, грузить swf как контент. В AS3 так же?)

4. Есть ли возможность грузить swf и потом дубрировать/аттачить? (Да-да-да, в FAQ написано, что нет - я и сем знаю - но не изменилось ли это в AS3?)

Спасибо!

Старый 05.11.2008, 23:23
musat вне форума Посмотреть профиль Отправить личное сообщение для musat Найти все сообщения от musat
  № 2  
Ответить с цитированием
musat
 
Аватар для musat

Регистрация: Jul 2007
Адрес: Дубна, Моск.обл.
Сообщений: 108
1. Потому что в классе-родителе нет свойства bb, надо либо сделать класс oval динамическим:
Код:
dynamic public class oval extends MovieClip {
либо, что еще лучше, написать так:
Код:
trace(this.parent.getChildByName("bb"));
2. Объектно-ориентированное программирование - классы.

3,4 - с этим пока не работал.

Старый 05.11.2008, 23:58
AS3noob вне форума Посмотреть профиль Отправить личное сообщение для AS3noob Найти все сообщения от AS3noob
  № 3  
Ответить с цитированием
AS3noob

Регистрация: Nov 2008
Сообщений: 14
1. Первое не помогло, второе - да, но отчего такой геморрой? Уже ли в as3 нет единого сквозного древа родителей-детей?
2. Это понятно, но - какова замена? Положим, мне требуется выполнить некий код синхронно с анимацией. Что, по enterFrame ловить номер кадра и обрабатывать? Это гораздо менее экономично, чем привязать код к событию достижения кадра.

Старый 06.11.2008, 00:20
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
0. Кто вас так научил называть классы? Хелп — врядли. Если это наследие тяжелого сишного прошлого, то надо срочно ликвидировать последствия;

1. А почему у вас клипы на одном уровне вложенности общаются друг с другом?

2. Децентрализация и сегментированность кода. На замену — addFrameScript;

3. Можно, Document class клипа и есть класс этого клипа;

4. Экземпляры классов — без проблем.


Последний раз редактировалось etc; 06.11.2008 в 00:26.
Старый 06.11.2008, 00:26
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 5  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Код в кадрах - это не вселенское зло, которого нужно избегать любой ценой. Он нужен именно тогда, когда требуется выполнить какое-то действие в привязке к анимации. У меня обычно дело ограничивается остановкой воспроизведения и посылкой события мол такое-то состояние достигнуто.
Чего действительно не следует делать - так это пихать в кадры всю логику приложения.

Геморрой с детьми происходит во-первых из-за строгой типизации и того факта что класс MovieClip не является динамическим, что не позволяет навешивать на него новые свойства во время выполнения, и это даёт прирост производительности. А ещё это хорошо с точки зрения инкапсуляции: прячется всё, что только можно.
Например если взять некий мувик test, у которого в классе прописано
Код:
private mc:MovieClip;
...
this.mc = new MovieClip();
this.addChild(this.mc);
то через test.mc мы наш объявленный мувик достать не сможем, потому что он умышленно скрыт от посторонних. Тут помогут только обходные методы типа getChildByName или getChildAt
В AS3 так заведено, что если кому-то нужно дать доступ к мувику/спрайту, то нужно передать на него ссылку. Потому что чем меньше переменных "видит" каждый отдельный блок кода, тем более независимым он является и тем легче он изменяется и отлаживается.
__________________
тонкий тролль, осеянный благодатью

Старый 06.11.2008, 03:53
AS3noob вне форума Посмотреть профиль Отправить личное сообщение для AS3noob Найти все сообщения от AS3noob
  № 6  
Ответить с цитированием
AS3noob

Регистрация: 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.
Старый 06.11.2008, 06:20
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 7  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
AS3noob,
Цитата:
Ясное дело, что это все можно сделать на вызове функции класса GUI (хотья опять-же, надо прописать путь к экземпляру класса, реализующего GUI), прикрутить сюда какой-нибудь as broadcaster и пр., но это все выглядит как атомный реактор на рыбацкой джонке.
Если один мувик должен общаться на одном уровне вложенности с другим, то он должен испускать событие, которое слушает функция родителя, и уже в этой функции управляется второй мувик. При этом в родителе присутствуют ссылки на оба мувика. Это есть правильно. Если так не делать, то потом сами же запутаетесь при апгрейде приложения.

Старый 06.11.2008, 09:58
AS3noob вне форума Посмотреть профиль Отправить личное сообщение для AS3noob Найти все сообщения от AS3noob
  № 8  
Ответить с цитированием
AS3noob

Регистрация: Nov 2008
Сообщений: 14
s8000_1
Ммммда...
Вот как раз эту идею я воспринимаю как прицеп к майбаху. Если у меня есть функционал GUI, сепаратно описанный от других в классе, и функционал основного приложения, столь же автономный, то связывать это все через некий "надведомственный клип" мне кажется неестественным. Ничуть не изящней, чем прямое воздействие в духе AS1. В этом аспекте, даже широковещательная связь, вроде asБroadcaster, кажется мне более разумной. Не говоря уж того, что я в упор не понимаю, почему (и зачем) нет возможности связываться с другой ветвью иерархического древа объектов фильма, тогда как связь "прямо вверх" и "прямо вниз" работает без проблем, при очевидном существовании самого древа. Разумеется, при учете защиты данных - приватов и пр.
Конечно, если "здесь так принято", то против брандспойта не попрешь, но очень приятно, когда тебя не заставляют, а уговаривают и логично обосновывают необходимость тех или иных телодвижений, тем более в таком формализуемом и логичном деле, как программирование. Это я, разумеется, не про вас, а про адобовцев.
Запутаться же можно в любом приложении, ключ - комментарии. Например, при описанном подходе, doc class будет связывать между собой кучу разных процессов, и бардак в нем будет не меньший, чем в большом приложении, написанном процедурно-ориентированным методом. Если продолжить пример с игрой, то воздействий в обе стороны между игрой и гуём может быть несколько десятков, многие из которых смехотворны, но интенсивны, типа вывода числа в текстовое поле (score, ammo, health, reload etc). Тот же самый объект-вещатель (равно как и цель воздействия) в одной области фильма есть, в другой нет, и как быть, привязывать листнера, которого нет, к событию, которое тоже пока не описано?
Почитаю пейджер, много подумаю...

Так или иначе, спасибо за совет.


Последний раз редактировалось AS3noob; 06.11.2008 в 10:23.
Старый 06.11.2008, 11:58
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
1. Это неправильная организация, а то, что сплошь и рядом — печально. Вам необходимо использовать MVC, тогда и всяческих _root.bla-bla-bla.gotoAndStop в жизни не будет;

3. Используйте композицию тогда;

4. new.

s8000_1, клипы на одном уровне вложенности вообще общаться друг с другом не должны, это не есть правильно.

AS3noob, пишите контроллер интерфейса, получайте события от кнопок в GUI, изменяйте модель, а интерфейс сам подстроится под модель. Это есть правильно и не создает никаких проблем в реализации.

Старый 06.11.2008, 16:36
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 10  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
__etc, ну я правильно понимаю?

[IMG]http://pic.************/uploads/081106/ItpGogdwrd.png[/IMG]

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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