Узел XML: применяем атрибуты к мувиклипу
Cначала пару слов о том, что такое XML. В принципе я и сам не особо вдавался в подробности, поэтому нижесказанное не претендует на полноту и достовернось.
Вам только кажется, что вы не знаете что такое XML, если конечно вам так кажется. Если вы знаете, что такое HTML, то вы в курсе, что такое XML, поскольку HTML - это частный случай XML. И тот и другой вид разметки документа требуют парсинга (разбора и применения атрибутов к объектам), Однако HTML парсит броузер, а XML нужно парсить самим. В этом есть своя прелесть. Потому, что используя XML мы можем создавать любые свойства, а не только продиктованные стандартом HTML, задавать им значения и применять их к любым объектам, в том числе и во Flash.
Сегодня на примере функции обработки одного узла (в HTML это называется тегом) мы рассмотрим как это можно сделать.
xmlTmp = new XML("<tree><mc1 _x='10' _y='20' _rotation='-10' status='busy'></mc1><mc2 _x='20' _y='40' _rotation='40'></mc2><mc3 _x='30' _y='50' _rotation='60'></mc3><mc4 _x='80' _y='80' _rotation='-115' status='busy'></mc4><mc5 _x='150' _y='120' _rotation='20' status='busy'></mc5></tree>");// создаем объект XML, который содержит описание свойств пЯти мувиклипов. Обратите внимание, что мы сразу пишем имена свойств мувиклипов так же как и во флеш, типа _x, _rotation. (XML может быть, и чаще всего бывает внешним файлом, так с ним удобней работать.)
XMLNode.prototype.applyProp = applyProp; // помещаем в прототип XML узла функцию переноса свойств из XML в мувиклип, заданную ниже
function applyProp (to) { // задаем функцию с аргументом to, в который будем помещать ссылку на мувиклип
// вначале, длЯ упрощениЯ обращениЯ к объектам:
var a = this.attributes; // помещаем в переменную a ссылку на массив атрибтов узла. Обратите внимание, что this в данном случае - это узел XML, поскольку мы первой строкой скрипта эту функцию поместили в прототип узла, и вызывать ее будем используЯ следующий синтаксис: узелXML.имЯФункции(ссылка на мувиклип)
var b = eval(to); // помещаем в переменную b ссылку на мувиклип, в который будем помещать новые свойства
var vars; // объЯвлЯем локальную переменную (она помрет по завершении работы функции)
var val; // и еще одну
for (vars in a) { // последовательно присваиваем переменной vars все значениЯ имен атрибутов в массиве атрибутов
val = a[vars];// последовательно присваиваем переменной val значениЯ соответствующих атрибутов
if (isNaN(Number(val))) {// если значение аттрибута не конвертируетсЯ из string в number, то это строка и
b[vars] = val;// присваиваем переменной с именем атрибута значение атрибута
} else {// иначе
b[vars] = Number(val);// присваиваем переменной с именем атрибута конвертированное в number значение атрибута
}
}
}
nod = xmlTmp.firstChild.firstChild; // присваиваем переменной ссылку на узел XML
while (nod) { // пока не переберем все узлы
name = nod.nodeName;// помещаем имЯ узла в переменную
this.attachMovie("mc", name, i++); // помещаем из библиотеки линкованный мувик имеющий идентификатор mc, задаем ему то же имЯ что и узел.
nod.applyProp(this[name]); // вызываем из узла нашу функцию и передаем ей через параметр ссылку на мувиклип
nod = nod.nextSibling; // переходим на следующий узел
}
// удалЯем ненужные больше объекты:
delete xmlTmp;
delete i;
delete nod;
delete name
в этот раз мы не рассмотрели как правильно обойти всё дерево XML, да это и не требовалось. Зато мы побывали в самом сердце XML - в узле, взяли его атрибуты и поместили их в свойства мувиклипа.
Задание будет таким: попробуйте сами создать в узлах дополнительный атрибут с именем _alpha и присвойте ему значения по своему усмотрению. Создайте также текстовое поле в мувиклипе и поместите в него значение еще одного атрибута из XML, имя и значение этого атрибута выберите по собственному усмотрению.