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

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

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

Регистрация: Jan 2012
Сообщений: 26
Attention Поиск Объектов, по имени, из списка отображения.

Ув. Flash/Flex программисты нужно решить задачу, если у кого есть готовое решение не откажусь.
Насколько я понимаю здесь нужно реализовать обход дерева, пока не найдем нужный DisplayObject...
Я реализовал обход дерева, просто развернув его в Vector, но такой подход медленнее чем РЕКУРСИВНЫЙ.
Да и РЕКУРСИВНЫЙ ПОДХОД ТОЖЕ НЕ КАТИТ((

Вот примерный прототип функции:
public static DisplayObject searchByNameDO( o: DisplayObjectContainer, oname: String ): DisplayObject{
}

Старый 29.01.2012, 19:59
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
надо бы уточнить ограничения, почему не катит рекурсия и т.п.
чем например такой (в лоб, без затей) не подходит ?
Код AS3:
public static function searchByNameDO(o:DisplayObjectContainer, oname:String):DisplayObject
{
	for (var i:int = 0; i < o.numChildren; i++) 
	{
		var child:DisplayObject = o.getChildAt(i);
		if (child.name == oname)
		{
			return child;
		}else if( child  is DisplayObjectContainer)
		{
			return searchByNameDO(child as DisplayObjectContainer, oname);
		}
	}
	return null;
}

Старый 29.01.2012, 20:02
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 3  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Шеф сказал без Рекурсий(( Объяснил мне тем, что нужна скорость больше...
P.S. Согласись неопровержимый факт)

Старый 29.01.2012, 20:18
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вы столько дисплей объектов не сможете создать, чтобы заметить разницу в скорости работы.
Кроме того, у вас не получится оптимальное решение с циклом, т.как вы не сможете получить списки всех родителей и детей массивом, или какой-то структурой которая сама может запомнить последную позицию перед тем как вы сделали выбор брат/ребенок. Т.е. вам нужно будет куда-то записывать индекс последнего обработанного ребенка для каждого контейнера обрабоку которого вы еще не закончили (вместо того, чтобы хранить это все на стеке).
Конечно, это тяжело говорить шефу, что он ошибается... но задача имеет геометрический смысл, только в случае если это какое-то тестовое задание. А так - глупость.
__________________
Hell is the possibility of sanity

Старый 29.01.2012, 20:33
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 5  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
В порядке бреда:
Можно заносить всех детей в нужную вам структуру данных по Event.ADDED, ловящемся на контейнере (корне дерева), например.
Если цепляется лист -- хорошо.
Если цепляется поддерево -- его обходим рекурсивно, но это незначительно при малых поддеревьях.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 29.01.2012, 20:56
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 6  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Спасибо, я понимаю что может рекурсия самый оптимальный вариант, но так-как я на испытательном сроке, то что-то доказывать шефу не стану((
Как я в самом начале пытался делать:

getChildByName(name:String)isplayObject
Возвращает экземпляр дочернего экранного объекта с заданным именем.
1. Прогоняю корень через getChildByName, если результата нет.
2. Иду вниз по всем детям пока не найду нужный либо дерево не закончиться.
!!! Но в процессе реализации запутался очень с тим ДЕРЕВОМ, удалил весь код и написал развертку дерева в Vector и после пробегал по вектору getChildByName-ом. Мне шеф "забанил" работу с вектором, подскажите оптимальный алгоритм пробега по n-арному дереву.

Старый 29.01.2012, 21:07
Stitch512 вне форума Посмотреть профиль Отправить личное сообщение для Stitch512 Найти все сообщения от Stitch512
  № 7  
Ответить с цитированием
Stitch512

Регистрация: Nov 2010
Сообщений: 150
Код AS3:
public static function searchByNameDO(owner: DisplayObjectContainer, name: String): DisplayObject
{
	var stackContainers:Vector.<DisplayObjectContainer> = new Vector.<DisplayObjectContainer>();
	var stackIdx:Vector.<int> = new Vector.<int>();
 
	var currContainer:DisplayObjectContainer = owner;
	var idx:int = 0;
 
	while (currContainer != null)
	{
		var result:DisplayObject = currContainer.getChildByName(name);
		if (result != null)
			return null;
 
		while (idx < currContainer.numChildren)
		{
			var container:DisplayObjectContainer = currContainer.getChildAt(i)  as DisplayObjectContainer;
			if (container != null)
			{
				stackContainers.push(currContainer); 
				stackIdx.push(idx);
 
				currContainer = container;
				idx = 0;
 
				break;
			}
 
		        idx++;
	       }
 
               currContainer = stackContainers.pop();
               idx = stackIdx.pop();
        }
}
Можно что-то вроде такого. Работоспособность не проверял, но суть в том чтобы вместо использования рекурсии вручную запоминать в переменных стековые значение. Т.е. по факту та же самая рекурсия, но реализованная вручную.

Добавлено через 7 минут
Цитата:
!!! Но в процессе реализации запутался очень с тим ДЕРЕВОМ, удалил весь код и написал развертку дерева в Vector и после пробегал по вектору getChildByName-ом. Мне шеф "забанил" работу с вектором, подскажите оптимальный алгоритм пробега по n-арному дереву.
Код AS3:
public static function searchByNameDO(container: DisplayObjectContainer, name: String): DisplayObject
{
	var result:DisplayObject = container.getChildByName(name);
	if (result != null)
		return null;
 
	for (var i:int = 0; i<container.numChildren; i++) 
	{
		var childContainer:DisplayObjectContainer = container.getChildAt(i) as DisplayObjectContainer;
		if (childContainer != null)
		{
			result = searchByNameDO(childContainer);
			if (result != null)
				return result;
		}
	}
 
	return null;
}


Последний раз редактировалось Stitch512; 29.01.2012 в 21:15.
Старый 29.01.2012, 21:27
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Насколько часто у вас меняется display list?

Добавлено через 2 минуты
Ну и смысл задачи не ясен. Вам надо найти все DO с определенным именем или только первый.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 29.01.2012, 21:45
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 9  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Насчет изменений дисплей листа меня не уведомили, но завтра на месте спрошу. Думаю смысл задачи вернуть хотя-бы первый попавшийся объект с заданным именем, без использования РЕКУРСИИ. Буду благодарен за любые варианты решений!)

Добавлено через 1 час 5 минут
Ув. Stitch512, у меня пару вопросов по исходнику, который не рекурсивный.

Код AS3:
public static function searchByNameDO(owner: DisplayObjectContainer, name: String): DisplayObject
{
	var stackContainers:Vector.<DisplayObjectContainer> = new Vector.<DisplayObjectContainer>();
	var stackIdx:Vector.<int> = new Vector.<int>();
 
	var currContainer:DisplayObjectContainer = owner;
	var idx:int = 0;
 
	while (currContainer != null)
	{
		var result:DisplayObject = currContainer.getChildByName(name);
		if (result != null)
			return null;//ЗДЕСЬ return result; ???
 
		while (idx < currContainer.numChildren)
		{
			var container:DisplayObjectContainer = currContainer.getChildAt(i)  as DisplayObjectContainer;
                        //ЗДЕСЬ вместо i - idx или просто наращивать i ниже? 
			if (container != null)
			{
				stackContainers.push(currContainer); 
				stackIdx.push(idx);
 
				currContainer = container;
				idx = 0;
 
				break;
			}
 
		        idx++;
	       }
 
               currContainer = stackContainers.pop();//Что здесь происходит?
               idx = stackIdx.pop();//Что здесь происходит?
        }
        return null;
}
Заранее благодарен за ответ!)


Последний раз редактировалось Vitalya; 29.01.2012 в 22:58.
Старый 29.01.2012, 23:13
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 10  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Вот вам без рекурсии.
Код AS3:
private const objectsMap:Object = {};
...
stage.addEventListener(Event.ADDED_TO_STAGE, stage_addedToStagehandler, true);
stage.addEventListener(Event.REMOVED_FROM_STAGE, stage_removedToStagehandler, true);
...
protected function stage_removedToStagehandler(event:Event):void
{
    objectsMap[event.target.name] = event.target;
 
}
protected function stage_addedToStagehandler(event:Event):void
{
    delete objectsMap[event.target.name];
}
 
private function searchByName(name:String):DisplayObject
{
    return objectsMap[name];
}
Но, возвращать будет всегда последний добавленный в список отображения объект с именем name, а удалять его будет как только будет удален, хотя бы один объект с именем name. Думаю догадаетесь как это обойти. Ну и name у объектов меняться не должен, иначе будут утечки (для своих объектов это решаемо).
__________________
משיח לא בא
משיח גם לא מטלפן

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

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

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


 


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


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