Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Странное поведение XML / циклов (http://www.flasher.ru/forum/showthread.php?t=113457)

E.Q. 29.06.2008 22:03

Странное поведение XML / циклов
 
Эм... Дело обстоит так. Загружаю xml-файл, все прекрасно читается, и по нему выстраиваются клипы на сцене.
Все строится тремя циклами, соответственно три уровня иерархии.

Код:

function chainReaction() {
        // Установка положений объектов
        // Фонового листа
        _root.sheet_mc._y = Stage.height/2-_root.sheet_mc._height/2;
        _root.sheet_mc._x = 10;

        //Цикл создания блоков
        for (var b = 0; b<_root.h_xml.firstChild.childNodes.length; b++) {
                trace("block "+b);
                _root.attachMovie("block","block"+b+"_mc",getNextHighestDepth());
                _root["block"+b+"_mc"]._y = _root.sheet_mc._y+11;
                _root["block"+b+"_mc"]._x = _root.sheet_mc._x+_root["block"+b+"_mc"]._width*b;
                _root.vertHeit = _root["block"+b+"_mc"]._y;
                trace("block y = "+_root["block"+b+"_mc"]._y);
                //Цикл создания категорий
                for (var c = 0; c<_root.h_xml.firstChild.childNodes[b].childNodes.length; c++) {
                        trace("+ category "+c+" "+_root.h_xml.firstChild.childNodes[b].childNodes[c].attributes.ttl);
                        _root.attachMovie("category","cat"+c+"_mc",getNextHighestDepth());
                        _root["cat"+c+"_mc"]._y = _root.vertHeit;
                        _root.vertHeit += 20;
                        _root["cat"+c+"_mc"]._x = _root["block"+b+"_mc"]._x+_root["block"+b+"_mc"]._width/2-_root["cat"+c+"_mc"]._width/2;
                        _root["cat"+c+"_mc"].txt.text = _root.h_xml.firstChild.childNodes[b].childNodes[c].attributes.ttl;
                        //Цикл создания ссылок
                        for (var k = 0; k<_root.h_xml.firstChild.childNodes[b].childNodes[c].childNodes.length; k++) {
                                trace("  + link "+k+" "+_root.h_xml.firstChild.childNodes[b].childNodes[c].childNodes[k].attributes.site+" y="+_root.vertHeit);
                                _root.attachMovie("link","link"+k+"_mc",getNextHighestDepth());
                                _root["link"+k+"_mc"]._y = _root.vertHeit;
                                _root.vertHeit += 15;
                                _root["link"+k+"_mc"]._x = _root["cat"+c+"_mc"]._x;
                                _root["link"+k+"_mc"].txt.text = _root.h_xml.firstChild.childNodes[b].childNodes[c].childNodes[k].attributes.site;

                        }
                }
        }
}

М... Чтобы было понятней, вот скриншоты с разным содержанием xml:
Непонятно, почему трэйсом все нормально выводится, а при выстраивании клипов такое разнообразие?
А самое неподдающееся моему объяснению на последних двух скринах - xml обрабатывается как будто кусками... Может ктонибудь может дать мне совет или объяснение происходящего?
И еще вопрос, может ли флешка вести себя по разному на разных компьютерах (имеется в виду железо)?

etc 29.06.2008 22:05

Боже мой, клинопись какая-то и не лень было копипастить _root["block"+b+"_mc"] и _root["cat"+c+"_mc"] тыщу раз, напрягая мозг и машину?

E.Q. 29.06.2008 22:18

__etc А как стоило бы сделать?

MrPoma 29.06.2008 22:22

Сделать функцию createBlock() и передавать ей значения.

etc 29.06.2008 22:29

Цитата:

Сообщение от E.Q. (Сообщение 748720)
__etc А как стоило бы сделать?

Выделить отдельные ссылки, для начала, чтобы не тащить эту громоздкую конструкцию сквозь весь код.

wvxvw 29.06.2008 23:21

Код:

function chainReaction() {
        // Установка положений объектов
        // Фонового листа
        var mc:MovieClip = _root.sheet_mc;
        var nmc:MovieClip;
        var nmc0:MovieClip;
        var nmc00:MovieClip;
        var xml:XMLNode = _root.h_xml.firstChild;
        var xml0:XMLNode;
        var xml00:XMLNode;
        var i:Number;
        var c:Number;
        var k:Number;
        var l:Number = xml.childNodes.length;
        var l0:Number;
        var l00:Number;
        mc._y = Stage.height/2 - mc._height/2;
        mc._x = 10;
        //Цикл создания блоков
        for (i = 0; i < l; i++) {
                trace("block " + i);
                nmc = _root.attachMovie("block", "block" + i + "_mc", _root.getNextHighestDepth());
                nmc._y = mc._y + 11;
                nmc._x = mc._x + nmc._width * i;
                _root.vertHeit = nmc._y;
                trace("block y = " + nmc._y);
                //Цикл создания категорий
                xml0 = xml.childNodes[i];
                l0 = xml0.childNodes.length;
                for (c = 0; c < l0; c++) {
                        trace("+ category " + c + " " + xml0.childNodes[c].attributes.ttl);
                        nmc0 = _root.attachMovie("category", "cat" + c + "_mc", _root.getNextHighestDepth());
                        nmc0._y = _root.vertHeit;
                        _root.vertHeit += 20;
                        nmc0._x = nmc._x + nmc._width/2 - nmc0._width/2;
                        nmc0.txt.text = xml0.childNodes[c].attributes.ttl;
                        //Цикл создания ссылок
                        xml00 = xml0.childNodes[c];
                        l00 = xml00.childNodes.length;
                        for (var k = 0; k < l00; k++) {
                                trace("  + link " + k + " " + xml00.childNodes[k].attributes.site + " y=" + _root.vertHeit);
                                nmc00 = _root.attachMovie("link", "link" + k + "_mc", _root.getNextHighestDepth());
                                nmc00._y = _root.vertHeit;
                                _root.vertHeit += 15;
                                nmc00._x = nmc0._x;
                                nmc00.txt.text = xml00.childNodes[k].attributes.site;

                        }
                }
        }
}

Просто find-and-replace. Но, на самом деле можно было и красивше и короче =)

E.Q. 29.06.2008 23:27

Мммм. Пасибо. Просто уже около года не занимался Флесчем. Теперь буду разбираться.
Значит, все это проблемы громоздкого кода?

wvxvw 30.06.2008 01:32

я думаю, что проблема была в том, что getNextHighestDepth() вызывался непонятно откуда (если проблема решилась), я просто дописал спереди _root, но как бы это тоже плохое решение, просто я не знаю как там у вас и чего =)
А вообще, нормальный способ решения такой задачи:
2 функции:
парсер и генератор.
парсер : читает ХМЛ и вызывает генератор с нужными параметрами.
генератор : на основе полученых параметров создает новый объект.

etc 30.06.2008 01:38

Цитата:

Сообщение от E.Q. (Сообщение 748747)
Значит, все это проблемы громоздкого кода?

В том числе. И разбираться в нём противно.


Часовой пояс GMT +4, время: 00:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.