Оцените строку пути, которая содержит вложенный мувиклип в AS3
Это должно быть довольно просто, но я понимаю, почему это не работает. Я надеюсь, что есть умный способ сделать следующее:
У меня есть строка 'movieclip1.movieclip2'
У меня есть контейнерный видеоклип - Контейнер.
Теперь, чтобы нормально оценить строку, я бы выглядел примерно так:
this.container['movieclip']['movieclip2']
Потому что clip2 - это потомок из мувиклипа.
Но я хотел бы проанализировать или оценить строку с синтаксисом точки, чтобы прочитать строку как внутренний путь.
this.container[evaluatedpath]; // which is - this.container.movieclip.movieclip2
Есть ли функция или методика, позволяющая вычислить эту строку по внутреннему пути?
Благодарю.
1 ответ
Насколько я знаю, нет никакого способа пройти через 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;
}