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

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

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
По умолчанию [РЕШЕНО] Рекурсивно найти на сцене ребенка с заданным ID

У меня что-то совсем мозг поплыл, уже час не могу решить задачу, которая казалась простецкой.
В общем, суть такая, есть в каком-то контейнере ребенок, у которого есть поле ID с определенным значением. Контейнер не известен, а как корневой объект для начала поиска берется stage. Собственно, как рекурсивно обойти всех детей stage и найти этого ребенка, если известен только его ID?
Это нужно для получения ссылки на этого ребенка.
п.с. Просьба не писать, что можно было положить их всех в массив, чтобы сохранить ссылки и т.п., так как задача совершенно другая. Мне нужно максимально изолировать игровой тутор от основной логики игры, поэтому пепердавать туда какие-либо ссылки я не хочу.
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 16.05.2016 в 21:30.
Старый 16.05.2016, 20:58
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Код AS3:
function getChildById(container:DisplayObjectContainer,id:String=""):DisplayObject {
var res:DisplayObject;
for(var i:uint=0;i<container.numChildren;i++) {
if (container.getChildAt(i).id==id) return container.getChildAt(i);
if (container.getChildAt(i) is DisplayObjectContainer) {
res=getChildById(container.getChildAt(i),id);
}
}
return res;
}
ПС:код не тестил.

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
undefined,
Так работать не будет, точнее будет ошибка компиляций, так-как у дисплей объектов нет поля id.
Тут надо использовать метод hasOwnProperty(), который принадлежит Object и не подсвечивается в редакторе FD.

caseyryan,
Сходи поспи
__________________
Дети не должны знать о своих родителях

Старый 16.05.2016, 21:13
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
я идею показать хотел.Для кейси причесать напильником не должно представлять труда

Старый 16.05.2016, 21:15
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Tails Посмотреть сообщение
caseyryan,
Сходи поспи
Я ж уснуть не смогу, пока не сделаю

п.с. Серег, твой способ не работает. Там же переназначение res при каждой итерации. Что-то простая задачка превратилась в какую-то кашу) Видимо действительно лучше на утро оставить
__________________
Ко мне можно и нужно обращаться на ты)

Старый 16.05.2016, 21:19
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 6  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
а ну да, надо его присваивать только если res==null
Код AS3:
if (container.getChildAt(i) is DisplayObjectContainer && !res) {
res=getChildById(container.getChildAt(i),id);
}
Добавлено через 4 минуты
проверил - вроде ищет:
Код AS3:
import flash.display.DisplayObjectContainer;
 
function getChildById(container:DisplayObjectContainer,id:String=""):DisplayObject {
var res:DisplayObject;
for(var i:uint=0;i<container.numChildren;i++) {
if (container.getChildAt(i).name==id) return container.getChildAt(i);
if (container.getChildAt(i) is DisplayObjectContainer && !res) {
res=getChildById(container.getChildAt(i) as DisplayObjectContainer,id);
}
}
return res;
}

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Все, вопрос решен)
Код AS3:
/**
 * рекурсивно возвращает из всего списка дисплей объектов тот, 
 * у которого tutorID соответствует нужному
 * @param	container корневой контейнер для поиска
 * @param	tutorID нужный идентификатор
 * @return
 */
private static function getITutorByID(container:DisplayObjectContainer, tutorID:String):ITutor {
 
	var numChildren:int = container.numChildren;
	if (container is ITutor) {
		var iTutor:ITutor = container as ITutor;
		if (iTutor.tutorID == tutorID) return iTutor;
	}
	for (var i:int = 0; i < numChildren; i++) {
		var child:DisplayObject = container.getChildAt(i) as DisplayObject;
		if (child is DisplayObjectContainer) {
			iTutor = getITutorByID(child as DisplayObjectContainer, tutorID);
			if (iTutor) return iTutor;
		} else {
			if (child is ITutor) {
				iTutor = child as ITutor;
				if (iTutor.tutorID == tutorID) return iTutor;
			}
		}
	}
	return null;
}
на сколько он кривой посмотрю завтра) На сегодня работает, и могу теперь спокойно лечь спать
__________________
Ко мне можно и нужно обращаться на ты)

Старый 16.05.2016, 21:25
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 8  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
только проверку на существование id поменяй

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Спасибо) Завтра сравню со своим, посмотрю какой лучше использовать
__________________
Ко мне можно и нужно обращаться на ты)

Старый 16.05.2016, 21:37
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 10  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
а как это можно менять тему топика?

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

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

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


 


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


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