Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [РЕШЕНО] Рекурсивно найти на сцене ребенка с заданным ID (http://www.flasher.ru/forum/showthread.php?t=212855)

caseyryan 16.05.2016 20:46

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

undefined 16.05.2016 20:58

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

ПС:код не тестил.

Tails 16.05.2016 21:10

undefined,
Так работать не будет, точнее будет ошибка компиляций, так-как у дисплей объектов нет поля id.
Тут надо использовать метод hasOwnProperty(), который принадлежит Object и не подсвечивается в редакторе FD.

caseyryan,
Сходи поспи :)

undefined 16.05.2016 21:13

я идею показать хотел.Для кейси причесать напильником не должно представлять труда :D

caseyryan 16.05.2016 21:15

Цитата:

Сообщение от Tails (Сообщение 1194092)
caseyryan,
Сходи поспи :)

Я ж уснуть не смогу, пока не сделаю :D

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

undefined 16.05.2016 21:19

а ну да, надо его присваивать только если 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;
}


caseyryan 16.05.2016 21:24

Все, вопрос решен)
Код 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;
}

на сколько он кривой посмотрю завтра) На сегодня работает, и могу теперь спокойно лечь спать :D

undefined 16.05.2016 21:25

только проверку на существование id поменяй

caseyryan 16.05.2016 21:29

Спасибо) Завтра сравню со своим, посмотрю какой лучше использовать

undefined 16.05.2016 21:37

а как это можно менять тему топика?


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

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