Делал давеча подгрузку уровня из XML.
Столкнулся с тем что надо было выбират заранее известные имена атрибутов, но при этом обращаться не напрямую а в "динамике".
Вобщем решилось все просто, но в сети как не пытался найти ответ на это простой вопрос не смог.
Собственно решение так же спокойно можно использовать и для записи, уровня в редакторе.
xmlData.levels.level[level].level_map[y+1].attribute(name_txt)
Cобственно вся суть именно в этой строке. Точнее в свойстве attribute(someshit).
Если всё остальное делается более менее понятно...
Берем из общего XML, секцию LEVELS,
там берем нужную нам (в функцию передается номер уровня) секцию с описанием уровня LEVEL[],
дальше выбираем сам строку уровня LEVEL_MAP[нужная строка],
и вот тут мы сталкиваемся с необходимостью выбирать атрибуты позиции колонок, можно конечно тупо использовать CASE, но уж очень тупо и неудобно...
так что в данном случае я использую свойство attribute(someshit), которое возвращает мне нужное значение указанного в нем поименованного атрибута...
Можно конечно сделать описание строки просто текстом, что-то вроде 104030180108408, но это сработает когда у нас элементов меньше 10, когда их больше, придется парсит строку, вводя туда коды конца элемента...
нафиг такие сложности? Когда при такой таблице мы спокойно можем редактировать уровни в любом текстовом редакторе, а если использовать XMLspy, или подобный ему умеющий показывать XML d виде таблицы, то это просто экстаз.
Так как у меня размер блоков задан жестко, и их количество тоже, то решение реализовано простым вложенным циклом.
Вот так создаю и вывожу уровень.
public function makeBricks(level:int)
{
const ATRIBUTE_STR:String="m";
const BRICK_SIZE_X:int = 54;
const BRICK_SIZE_Y:int = 24;
const BRICK_SHIFT_X:int = 70;
const BRICK_SHIFT_Y:int = 70;
level -=1;
bricks = new Array();
var frame_r:int;
var name_txt:String;
for(var y:uint=0;y<11;y++)
{
for(var x:uint=0;x<15;x++)
{
name_txt = ATRIBUTE_STR + (x+1);
frame_r = int(xmlData.levels.level[level].level_map[y+1].attribute(name_txt));
if (frame_r > 0)
{
frame_r --;
var newBrick:Brick = new Brick();
// позиционируем кирпичики
newBrick.x = BRICK_SIZE_X*x+BRICK_SHIFT_X;
newBrick.y = BRICK_SIZE_Y*y+BRICK_SHIFT_Y;
newBrick.gotoAndStop(frame_r); // Устанавливаем нужны тип кирпича
bg_mc.addChild(newBrick);
bricks.push(newBrick);
}
}
}
}
А так выглядит XML
P.S. Если есть мысли, то велкам :)