Оцените строку пути, которая содержит вложенный мувиклип в AS3 - PullRequest
1 голос
/ 06 июня 2011

Это должно быть довольно просто, но я понимаю, почему это не работает. Я надеюсь, что есть умный способ сделать следующее:

У меня есть строка 'movieclip1.movieclip2'

У меня есть контейнерный видеоклип - Контейнер.

Теперь, чтобы нормально оценить строку, я бы выглядел примерно так:

this.container['movieclip']['movieclip2']

Потому что clip2 - это потомок из мувиклипа.

Но я бы хотел проанализировать или оценить строку с синтаксисом точки, чтобы прочитать строку как внутренний путь.

this.container[evaluatedpath];  // which is - this.container.movieclip.movieclip2

Существует ли функция или метод, позволяющий вычислить эту строку во внутреннем пути?

Спасибо.

1 Ответ

2 голосов
/ 06 июня 2011

Насколько я знаю, нет способа пройти через DisplayList с аргументом, подобным пути, ни с [], ни с getChildByName.

Однако вы можете написать свою собственную функцию длядобиться аналогичного эффекта (проверено и работает):

/**
 * Demonstration
 */
public function Main() {
    // returns 'movieclip2':
    trace((container['movieclip']['movieclip2']).name);
    // returns 'movieclip':
    trace(path(container, "movieclip").name);
    // returns 'movieclip2':
    trace(path(container, "movieclip.movieclip2").name);
    // returns 'movieclip2':
    trace(path(container, "movieclip#movieclip2", "#").name);
    // returns null:
    trace(path(container, "movieclip.movieclipNotExisting"));
}

/**
 * Returns a DisplayObject from a path, relative to a root container.
 * Recursive function.
 * 
 * @param   root            element, the path is relative to
 * @param   relativePath    path, relative to the root element
 * @param   separator       delimiter of the path
 * @return  last object in relativePath
 */
private function path(root:DisplayObjectContainer,
    relativePath:String, separator:String = ".") : DisplayObject {
    var parts:Array = relativePath.split(separator);
    var child:DisplayObject = root.getChildByName(parts[0]);
    if (parts.length > 1 && child is DisplayObjectContainer) {
        parts.shift();
        var nextPath:String = parts.join(separator);
        var nextRoot:DisplayObjectContainer = child as DisplayObjectContainer;
        return path(nextRoot, nextPath, separator);
    }
    return child;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...