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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.01.2012, 02:01
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 21  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

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

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

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Observer + 2 метода у пользовательского интерфейса
Причем, Вы сможете искать какие угодно объекты, главное чтобы они реализрвали интерфейс поиска

Никаких сканирований, никаких рекурсия, зачем эта головная боль
Мне кажется все ГОРАЗДО проще
Ведь ВЫ ищите ИМЯ

интерфейс поиска
Код AS3:
package interfaces
{
	public interface ISearchableElement
	{
		function set searchName(val:String):void;
		function get searchName():String;
	}
}
Observer
Код AS3:
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;
		}
	}
}
DisplayObject
Код AS3:
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);
		}
	}
}
Использование
Код AS3:
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);
		}
	}
}
трэйс
Код AS1/AS2:
'child1' total 3
'child14' total 1
'child711' total 2


Последний раз редактировалось djyamato; 30.01.2012 в 08:18.
Старый 01.02.2012, 14:48
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 23  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Вот если кому нужно будет.
Функция поиска Объекта в контейнере без использования РЕКУРСИИ, с минимумом запусков функций(т.к функция дорогая для Flash), и с фиксированным Вектором всего на 2 элемента.

Код AS3:
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;	
		}

Старый 01.02.2012, 14:52
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 24  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
first.addChild(owner);
 
if( owner == null ) return null;//Проверяем основной контейнер на пустоту
Не поздновато, проверять то?
__________________
משיח לא בא
משיח גם לא מטלפן

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну только вектор никак не длины 2, а ровно столько, сколько максимальная вложенность.
__________________
Hell is the possibility of sanity

Старый 01.02.2012, 15:42
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 26  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Вектор фиксированный, 2 элемента.
Код AS3:
first.addChild(owner);
 
if( owner == null ) return null;//Проверяем основной контейнер на пустоту
поздно было бы проверять это внутри цикла)

Старый 01.02.2012, 16:12
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 27  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Vitalya вы разве не понимаете, что first.addChild(null); выкенет RTE?
__________________
Марк Tween

Старый 01.02.2012, 17:06
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 28  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Вектор фиксированный, 2 элемента.
Фиксированный он будет, если вы вторым параметром в конструктор передадите true.
Код AS3:
// выше некуда
if( stackIdx.length == 0 )
	return null;
Вы его нигде не уменьшаете, у него длинна никогда не станет 0.
__________________
משיח לא בא
משיח גם לא מטלפן

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> Вектор фиксированный, 2 элемента.
Поменяйте вот эту строчку и создайте такой список объектов отображения, чтобы глубина была больше 2
Код AS3:
trace("идем внутрь", currContainer.name, lastElVec);
__________________
Hell is the possibility of sanity

Старый 01.02.2012, 19:44
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 30  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Цитата:
Фиксированный он будет, если вы вторым параметром в конструктор передадите true.
Код AS3:
// выше некуда
if( stackIdx.length == 0 )
return null;
Вы его нигде не уменьшаете, у него длинна никогда не станет 0.
Это верно!))Я просто забыл убрать из реализации с динамическим вектором.

Насчет фиксированного Вектора. Второй параметр в конструкторе дает ОШИБКУ((
Код AS3:
var stackIdx:Vector.<uint> = new Vector.<uint>(300, true);
Добавлено через 1 минуту
Я так понял, что если без второго параметра true в векторе, то он будет увеличиваться только в случае переполнения???

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

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

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


 


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


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