![]() |
Поиск Объектов, по имени, из списка отображения.
Ув. Flash/Flex программисты нужно решить задачу, если у кого есть готовое решение не откажусь.
Насколько я понимаю здесь нужно реализовать обход дерева, пока не найдем нужный DisplayObject... Я реализовал обход дерева, просто развернув его в Vector, но такой подход медленнее чем РЕКУРСИВНЫЙ. Да и РЕКУРСИВНЫЙ ПОДХОД ТОЖЕ НЕ КАТИТ(( Вот примерный прототип функции: public static DisplayObject searchByNameDO( o: DisplayObjectContainer, oname: String ): DisplayObject{ } |
надо бы уточнить ограничения, почему не катит рекурсия и т.п.
чем например такой (в лоб, без затей) не подходит ? Код AS3:
|
Шеф сказал без Рекурсий(( Объяснил мне тем, что нужна скорость больше...
P.S. Согласись неопровержимый факт) |
Вы столько дисплей объектов не сможете создать, чтобы заметить разницу в скорости работы.
Кроме того, у вас не получится оптимальное решение с циклом, т.как вы не сможете получить списки всех родителей и детей массивом, или какой-то структурой которая сама может запомнить последную позицию перед тем как вы сделали выбор брат/ребенок. Т.е. вам нужно будет куда-то записывать индекс последнего обработанного ребенка для каждого контейнера обрабоку которого вы еще не закончили (вместо того, чтобы хранить это все на стеке). Конечно, это тяжело говорить шефу, что он ошибается... но задача имеет геометрический смысл, только в случае если это какое-то тестовое задание. А так - глупость. |
В порядке бреда:
Можно заносить всех детей в нужную вам структуру данных по Event.ADDED, ловящемся на контейнере (корне дерева), например. Если цепляется лист -- хорошо. Если цепляется поддерево -- его обходим рекурсивно, но это незначительно при малых поддеревьях. |
Спасибо, я понимаю что может рекурсия самый оптимальный вариант, но так-как я на испытательном сроке, то что-то доказывать шефу не стану((
Как я в самом начале пытался делать: getChildByName(name:String):DisplayObject Возвращает экземпляр дочернего экранного объекта с заданным именем. 1. Прогоняю корень через getChildByName, если результата нет. 2. Иду вниз по всем детям пока не найду нужный либо дерево не закончиться. !!! Но в процессе реализации запутался очень с тим ДЕРЕВОМ, удалил весь код и написал развертку дерева в Vector и после пробегал по вектору getChildByName-ом. Мне шеф "забанил" работу с вектором, подскажите оптимальный алгоритм пробега по n-арному дереву. |
Код AS3:
Добавлено через 7 минут Цитата:
Код AS3:
|
Насколько часто у вас меняется display list?
Добавлено через 2 минуты Ну и смысл задачи не ясен. Вам надо найти все DO с определенным именем или только первый. |
Насчет изменений дисплей листа меня не уведомили, но завтра на месте спрошу. Думаю смысл задачи вернуть хотя-бы первый попавшийся объект с заданным именем, без использования РЕКУРСИИ. Буду благодарен за любые варианты решений!)
Добавлено через 1 час 5 минут Ув. Stitch512, у меня пару вопросов по исходнику, который не рекурсивный. Код AS3:
|
Вот вам без рекурсии.
Код AS3:
|
Цитата:
Код AS3:
|
in4core, такой цикл вернет ровно тоже самое, что и objectsMap[name] :)
имелось ввиду, что что если объектов с одинаковым именем будет не один, то хранится будет последний добавленный |
аа точно, затупил, сорри.
|
Цитата:
Цитата:
Код AS3:
Цитата:
Только наверное еще нужно после Код AS3:
Код AS3:
И Код AS3:
Добавлено через 2 минуты Вообщем суть этого алгоритма - замена рекурсии циклом, на сколько это оправданно в данном случае это уже другой вопрос, но в принципе возможно. |
Ув. alatar!
То есть, мы будем формировать в процессе создания сцены ассоциативный массив, и потом удобно вытягивать из него объекты. Но это метот будет полезен в случаи включения этих событий в программу в самом начале создания сцены. А как создать функцию которой можно будет заполнить objectsMap, считав информацию у уже существующей сцены? А именно с DisplayObjectContainer, в смысле, что у меня есть готовая сцена и мне нужно из нее вынуть именно нужный мне ОБЪЕКТ. Заранее спасибо за ответ. P.S Очень крутой подход c Object-ом. Добавлено через 13 минут Ув. Stitch512. Все, понял как оно там все работает)) А насчет тих вопросов Код AS3:
|
Сама архитектура в которой приходится искать объект по имени, а не получать его по ссылке попахивает. А если совсем прямо, сильно пахнет.
|
Я так понимаю, что в моей конторе, программисты используют эту функцию для упрощения работы.
Спасибо большое за ОГРОМНУЮ помощь! P.S. Если будут варианты насчет способа сканирования сцены в objectsMap, буду рад.) |
И что, упрощает?
|
Думаю, помогает автоматизировать доступ к каким то объектам, считывать имена из какой то структуры и что-то с ними делать.
Честно, точно не знаю - это только мои предположения) |
Вся идея с ассоциативным масивом как раз и состоит в том, чтобы не обходить весь дисплей лист. А функция заполнения этого масива как раз и будет базироваться либо на рекурсивном обходе, либо еще на чем нибуть похожем.
Короче, либо нормальная рекурсия, либо со старта заполняете ассоциативный масив! |
Как бы не сказать "бросайте". Но нет абсолютно ничего хорошего в том, чтобы искать экранные объекты по имени, а тем более где-то хз где. Это плохо не изза сложности алгоритма, а изза того, что код на каждом участке не должен влиять на код на другом, произвольном участке, неизвестно где находящемся. Особенность именно этого подхода еще и в том что имена - это публичные свойсва которые кто угодно откуда угодно может поменять. Они вообще существуют только потому что так, очевидно, было удобно реализовать дебаггер для Флеша (скорее всего еще для AS2). В практически любом языке есть возможности, которыми лучше не пользоваться - вот это свойство у экранных объектов как раз одно из таких. Нет, и в теории не может быть необходимости его использовать, а если нет необходимости, то противоположное справедливо - использование этого свойства = плохой код.
|
Observer + 2 метода у пользовательского интерфейса
Причем, Вы сможете искать какие угодно объекты, главное чтобы они реализрвали интерфейс поиска Никаких сканирований, никаких рекурсия, зачем эта головная боль Мне кажется все ГОРАЗДО проще Ведь ВЫ ищите ИМЯ интерфейс поиска Код AS3:
Код AS3:
Код AS3:
Код AS3:
Код AS1/AS2:
|
Вот если кому нужно будет.
Функция поиска Объекта в контейнере без использования РЕКУРСИИ, с минимумом запусков функций(т.к функция дорогая для Flash), и с фиксированным Вектором всего на 2 элемента. Код AS3:
|
Код AS3:
|
Ну только вектор никак не длины 2, а ровно столько, сколько максимальная вложенность.
|
Вектор фиксированный, 2 элемента.
Код AS3:
|
Vitalya вы разве не понимаете, что first.addChild(null); выкенет RTE?
|
Цитата:
Код AS3:
|
>> Вектор фиксированный, 2 элемента.
Поменяйте вот эту строчку и создайте такой список объектов отображения, чтобы глубина была больше 2 Код AS3:
|
Цитата:
Насчет фиксированного Вектора. Второй параметр в конструкторе дает ОШИБКУ(( Код AS3:
Я так понял, что если без второго параметра true в векторе, то он будет увеличиваться только в случае переполнения??? |
Да, вроде того. Сначала создаст пустой вектор на 256 элементов, а потом будет прибавлять по 256 * х, где х с каждым разом удваивается. Или что-то в этом духе. Это менялось от версии к версии плеера.
Конструктор вектора всегда принимал 2 аргумента, с самой первой версии. Вы наверное забыли new - в таком случае это конвертация в вектор, а не вызов конструктора. Не нужно писать три и больше вопросительных знаков - "???" в русском языке это эвфемизм "какого ...?" Если вы хотели задать вопрос, а не обматерить собеседника, одного вопросительного знака как раз достаточно. |
В моем случаи больше одного знака "?" - значит что очень нужен ответ и побыстрее. Никого ничем не хотел обидеть!)
|
| Часовой пояс GMT +4, время: 10:56. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.