|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[РЕШЕНО] Рекурсивно найти на сцене ребенка с заданным ID
У меня что-то совсем мозг поплыл, уже час не могу решить задачу, которая казалась простецкой.
В общем, суть такая, есть в каком-то контейнере ребенок, у которого есть поле ID с определенным значением. Контейнер не известен, а как корневой объект для начала поиска берется stage. Собственно, как рекурсивно обойти всех детей stage и найти этого ребенка, если известен только его ID? Это нужно для получения ссылки на этого ребенка. п.с. Просьба не писать, что можно было положить их всех в массив, чтобы сохранить ссылки и т.п., так как задача совершенно другая. Мне нужно максимально изолировать игровой тутор от основной логики игры, поэтому пепердавать туда какие-либо ссылки я не хочу.
__________________
Ко мне можно и нужно обращаться на ты) Последний раз редактировалось caseyryan; 16.05.2016 в 21:30. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
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; } |
|
|||||
undefined,
Так работать не будет, точнее будет ошибка компиляций, так-как у дисплей объектов нет поля id. Тут надо использовать метод hasOwnProperty(), который принадлежит Object и не подсвечивается в редакторе FD. caseyryan, Сходи поспи
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
я идею показать хотел.Для кейси причесать напильником не должно представлять труда
|
|
|||||
Я ж уснуть не смогу, пока не сделаю
п.с. Серег, твой способ не работает. Там же переназначение res при каждой итерации. Что-то простая задачка превратилась в какую-то кашу) Видимо действительно лучше на утро оставить
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а ну да, надо его присваивать только если res==null
if (container.getChildAt(i) is DisplayObjectContainer && !res) { res=getChildById(container.getChildAt(i),id); } проверил - вроде ищет: 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; } |
|
|||||
Все, вопрос решен)
/** * рекурсивно возвращает из всего списка дисплей объектов тот, * у которого 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; }
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
только проверку на существование id поменяй
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а как это можно менять тему топика?
|
Часовой пояс GMT +4, время: 13:03. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|