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

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

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

Регистрация: Jan 2010
Адрес: R = |z - z0|
Сообщений: 27
По умолчанию Рекурсивный поиск элемента вглубь контейнера

Вечер добрый, господа.

Я получаю от дизайнера уже готовый символ в виде swc-библиотеки, внутри которого где-то есть интересующий меня элемент. Глубина его вложения заранее не известна.

Вопрос: вы не встречали готового решения (оптимального по скорости) поиска чайлда по имени внутри контейнера на неизвестной заранее глубине? Или надо самому писать рекурсивный обход (мне не трудно, просто не хочу изобретать велосипед).

Спасибо.

Собственно, там возможны вариации с преобразованием типов (DisplayObject <-> DisplayObjectContainer) и с тем, делать ли это в виде функции, или встраивать в прототип. Вдруг кто-то уже видел хорошее решение?


Последний раз редактировалось Serg65535; 27.01.2010 в 23:00. Причина: уточнение
Старый 27.01.2010, 23:23
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 2  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Хорошим решением было бы договориться с дизайнером, чтобы он адекватные swc вам присылал.

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

Регистрация: Jan 2010
Адрес: R = |z - z0|
Сообщений: 27
Это да, но в ряде случаев символ требуется упаковать ещё в один символ, дабы сделать глобальный эффект какой-нибудь. Да и библиотека большая. Мне не трудно влезть в исходники и поглядеть точное расположение нужного объекта, но 1) я не хочу жёстко вбивать в код привязку к конкретной реализации графики, и 2) на стадии прототипирования игры это лишняя трата сил и времени, учитывая, что графика очень часто обновляется.

И в любом случае - это не решение вопроса, а его избегание.
Согласитесь, это отличная специфика русских форумов получать на вопросы ответы в духе "а нафига вам?" и "лучше поставь [название продукта]".

Старый 28.01.2010, 01:26
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 4  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
Код AS3:
 
public static function findChild(parentObject : DisplayObjectContainer, childName : String) : DisplayObject {
			var i : int = parentObject.numChildren;
			while (i--) {
				var child : DisplayObject = parentObject.getChildAt(i);
				if (child.name == childName)
  					return child; 
				if (child is DisplayObjectContainer) {
					child = findChild(child as DisplayObjectContainer, childName);
					if (child)
  						return child;
				}
			}
			return null;
		}
__________________
Блог, Twitter
Брюзга.

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

Регистрация: Sep 2002
Сообщений: 30,784
mayakwd, я бы всё же использовал бы ещё и родной getChildByName в самом начале. Нет смысла гонять цикл, если в контейнере уже есть ребенок с нужным именем.

Старый 28.01.2010, 08:22
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 6  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
а да, не учел, спасибо за дополнение.
__________________
Блог, Twitter
Брюзга.

Старый 28.01.2010, 08:57
Serg65535 вне форума Посмотреть профиль Отправить личное сообщение для Serg65535 Найти все сообщения от Serg65535
  № 7  
Ответить с цитированием
Serg65535
 
Аватар для Serg65535

Регистрация: Jan 2010
Адрес: R = |z - z0|
Сообщений: 27
mayakwd! Спасибо огромное!

Я примерно в ту же сторону думал (только через for()) но у меня были очень большие сомнения по поводу корректности подстановки типов DisplayObjectContainer вместо DisplayObject и наоборот, да и честно говоря я думал - может существует более универсальное решение, чем тупо рекурсия. Опыта программирования на AS пока не так много Мигрирую с шарпа активно

Ещё раз большое спасибо всем!

Добавлено через 4 часа 26 минут
Финальный вариант функции:

Код AS1/AS2:
public function findChild(parentObject: DisplayObjectContainer, childName: String): DisplayObject {
	var child: DisplayObject = parentObject.getChildByName(childName);
	if (child) return child;			
	var i: int = parentObject.numChildren;
	while (i--) {
		child = parentObject.getChildAt(i);
		if (child.name == childName) return child;
		if (child is DisplayObjectContainer) {
			child = findChild(child as DisplayObjectContainer, childName);
			if (child) return child;
		}
	}
	return null;
}

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

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

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


 


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


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