[as3] XML, динамические разборки

Sep 22, 2009 19:18

Делал давеча подгрузку уровня из 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. Если есть мысли, то велкам :)

gamedev, flash, as3

Previous post Next post
Up