![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
У меня что-то совсем мозг поплыл, уже час не могу решить задачу, которая казалась простецкой.
В общем, суть такая, есть в каком-то контейнере ребенок, у которого есть поле ID с определенным значением. Контейнер не известен, а как корневой объект для начала поиска берется stage. Собственно, как рекурсивно обойти всех детей stage и найти этого ребенка, если известен только его ID? Это нужно для получения ссылки на этого ребенка. п.с. Просьба не писать, что можно было положить их всех в массив, чтобы сохранить ссылки и т.п., так как задача совершенно другая. Мне нужно максимально изолировать игровой тутор от основной логики игры, поэтому пепердавать туда какие-либо ссылки я не хочу.
__________________
Ко мне можно и нужно обращаться на ты) Последний раз редактировалось caseyryan; 16.05.2016 в 21:30. |
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,282
|
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, Сходи поспи ![]()
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Я ж уснуть не смогу, пока не сделаю
![]() п.с. Серег, твой способ не работает. Там же переназначение res при каждой итерации. Что-то простая задачка превратилась в какую-то кашу) Видимо действительно лучше на утро оставить
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,282
|
я идею показать хотел.Для кейси причесать напильником не должно представлять труда
![]() |
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,282
|
а ну да, надо его присваивать только если 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,282
|
только проверку на существование id поменяй
|
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,282
|
а как это можно менять тему топика?
|
![]() |
![]() |
Часовой пояс GMT +4, время: 11:04. |
|
|
« Предыдущая тема | Следующая тема » |
|
|