![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Modus ponens
|
Как бы не сказать "бросайте". Но нет абсолютно ничего хорошего в том, чтобы искать экранные объекты по имени, а тем более где-то хз где. Это плохо не изза сложности алгоритма, а изза того, что код на каждом участке не должен влиять на код на другом, произвольном участке, неизвестно где находящемся. Особенность именно этого подхода еще и в том что имена - это публичные свойсва которые кто угодно откуда угодно может поменять. Они вообще существуют только потому что так, очевидно, было удобно реализовать дебаггер для Флеша (скорее всего еще для AS2). В практически любом языке есть возможности, которыми лучше не пользоваться - вот это свойство у экранных объектов как раз одно из таких. Нет, и в теории не может быть необходимости его использовать, а если нет необходимости, то противоположное справедливо - использование этого свойства = плохой код.
__________________
Hell is the possibility of sanity |
|
|||||
|
Observer + 2 метода у пользовательского интерфейса
Причем, Вы сможете искать какие угодно объекты, главное чтобы они реализрвали интерфейс поиска Никаких сканирований, никаких рекурсия, зачем эта головная боль Мне кажется все ГОРАЗДО проще Ведь ВЫ ищите ИМЯ интерфейс поиска package interfaces { public interface ISearchableElement { function set searchName(val:String):void; function get searchName():String; } } package managers { import interfaces.ISearchableElement; public class SearchManager { private static var instance:SearchManager; protected var _elements:Vector.<ISearchableElement>=new Vector.<ISearchableElement>(); public static function getInstance():SearchManager { if (instance == null) { instance = new SearchManager(); } return instance; } public function addSearchableElement(val:ISearchableElement):void { _elements.push(val); } public function searchByName(name:String):Vector.<ISearchableElement> { var elements:Vector.<ISearchableElement>=new Vector.<ISearchableElement>(); var i:int; var currElement:ISearchableElement; var total:int=_elements.length; for(i=0;i<total;i++) { if(_elements[i].searchName==name) { elements.push(_elements[i]); } } return elements; } } } package DisplayObject { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; import interfaces.ISearchableElement; import managers.SearchManager; public class SearchableDisplayObject extends Sprite implements ISearchableElement { protected var _searchName:String; public function SearchableDisplayObject() { addEventListener(Event.ADDED_TO_STAGE,addedToStageHandler); } public function set searchName(val:String):void { _searchName=val; } public function get searchName():String { return _searchName; } protected function addedToStageHandler(event:Event):void { SearchManager.getInstance().addSearchableElement(this); } } } package { import DisplayObject.SearchableDisplayObject; import flash.display.Sprite; import interfaces.ISearchableElement; import managers.SearchManager; public class UnlimDeepDOSearch extends Sprite { protected var _searchManager:SearchManager=SearchManager.getInstance(); public function UnlimDeepDOSearch() { var mySearchableDO1:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO1.searchName="child711"; var mySearchableDO2:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO2.searchName="child2"; var mySearchableDO3:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO3.searchName="child0"; var mySearchableDO4:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO4.searchName="child1"; var mySearchableDO5:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO5.searchName="child711"; var mySearchableDO6:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO6.searchName="child1"; var mySearchableDO7:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO7.searchName="child14"; var mySearchableDO8:SearchableDisplayObject=new SearchableDisplayObject(); mySearchableDO8.searchName="child1"; (mySearchableDO5 as Sprite).addChild(mySearchableDO7); (mySearchableDO5 as Sprite).addChild(mySearchableDO8); (mySearchableDO1 as Sprite).addChild(mySearchableDO5); (mySearchableDO1 as Sprite).addChild(mySearchableDO6); addChild(mySearchableDO1); addChild(mySearchableDO2); addChild(mySearchableDO3); addChild(mySearchableDO4); var searchChild1:Vector.<ISearchableElement>=_searchManager.searchByName("child1"); trace("'child1' total "+searchChild1.length); var searchChild14:Vector.<ISearchableElement>=_searchManager.searchByName("child14"); trace("'child14' total "+searchChild14.length); var searchChild711:Vector.<ISearchableElement>=_searchManager.searchByName("child711"); trace("'child711' total "+searchChild711.length); } } } Последний раз редактировалось djyamato; 30.01.2012 в 08:18. |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Вот если кому нужно будет.
Функция поиска Объекта в контейнере без использования РЕКУРСИИ, с минимумом запусков функций(т.к функция дорогая для Flash), и с фиксированным Вектором всего на 2 элемента. public static function searchByNameDO1( owner: DisplayObjectContainer, name: String ): DisplayObject { trace("Вход"); var first:MovieClip = new MovieClip(); first.name = 'null'; first.addChild(owner); if( owner == null ) return null;//Проверяем основной контейнер на пустоту var stackIdx:Vector.<uint> = new Vector.<uint>(2); var lastElVec:uint = 0;//указатель на последний элемент вектора var currContainer:DisplayObject = owner; var curChildIndex:int = 0;//счетчик углубленности в контейнере trace("curr=", currContainer.name ); do { // Имитация захода внутрь if( currContainer is DisplayObjectContainer ) { trace("currContainer is DisplayObjectContainer, curChildIndex="+curChildIndex); // идем внутрь if( curChildIndex < (currContainer as DisplayObjectContainer).numChildren ) { lastElVec++;//перетаскиваем указатель Вправо stackIdx[lastElVec] = curChildIndex;//stackIdx.push( curChildIndex ); currContainer = (currContainer as DisplayObjectContainer).getChildAt( curChildIndex ); curChildIndex = 0; trace("идем внутрь", currContainer.name ); continue; } } // проверка на доститжение результата trace( "проверка на доститжение результата" ); if( currContainer.name == name ) return currContainer; // Идем наверх // выше некуда if( stackIdx.length == 0 ) return null; // выше есть куда trace("выше есть куда до:",curChildIndex); //curChildIndex = stackIdx.pop()+1; curChildIndex = stackIdx[lastElVec]; lastElVec--; curChildIndex++; trace("выше есть куда после:",curChildIndex); currContainer = currContainer.parent;//возвращаемся к родителю // Если мы поднялись до уровня вызова } while ( currContainer != first ); return null; } |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Вектор фиксированный, 2 элемента.
поздно было бы проверять это внутри цикла) |
|
|||||
|
Цитата:
Вы его нигде не уменьшаете, у него длинна никогда не станет 0.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Modus ponens
|
>> Вектор фиксированный, 2 элемента.
Поменяйте вот эту строчку и создайте такой список объектов отображения, чтобы глубина была больше 2
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Цитата:
Насчет фиксированного Вектора. Второй параметр в конструкторе дает ОШИБКУ(( Добавлено через 1 минуту Я так понял, что если без второго параметра true в векторе, то он будет увеличиваться только в случае переполнения??? |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:04. |
|
|
« Предыдущая тема | Следующая тема » |
|
|