Неопределенная ошибка, которую я не могу понять - PullRequest
1 голос
/ 27 ноября 2009

Эй, ребята ... с математической проблемой. Попытка расположить сетку из серых прямоугольников, над которыми я хочу загрузить миниатюры. Я продолжаю получать сообщение об ошибке при попытке загрузить 4-й эскиз. Если вы удалите узел 4-го лица в xml, он будет работать, но добавление 4-го даст мне ошибку?

Код ниже.

Любая помощь очень ценится.

package 
{
    import flash.display.MovieClip;
    import flash.geom.Point;

    public class People extends MovieClip
    {

        public function People() 
        {
            draw();
        }

        public function draw():void
        {
            var colors:Array = [0xFF0000, 0x009900];
            var rows:Array = [];

            var xml:XML  = new XML("<data><navitem><person>person1</person><person>person2</person><person>person3</person><person>person4</person></navitem><navitem><person>person1</person><person>person2</person></navitem></data>");

            var j;
            var i;

            for (i in xml.navitem) {
                rows.push(new MovieClip());
                var totRows:Number = 0;
                for (j in xml.navitem[i].person) {
                    if(j % 3 == 1){
                        totRows++
                    }
                }

                if (totRows == 0) {
                    totRows = 1
                }

                rows[i].grid = createGrid(3, totRows, 85, 85,25, 25);
                for (j in rows[i].grid) {
                    var mc:MovieClip = new MovieClip();
                    with (mc) {
                        graphics.beginFill(0, .5);
                        graphics.drawRect(0, 0, 85, 85);
                        graphics.endFill();
                    }
                    mc.x = rows[i].grid[j].x;
                    mc.y = rows[i].grid[j].y;
                    rows[i].addChild(mc);
                }
                // add the people
                for (j in xml.navitem[i].person) {
                    var mc:MovieClip = new MovieClip();
                    with (mc) {
                        graphics.beginFill(colors[i], .5);
                        graphics.drawRect(0, 0, 85, 85);
                        graphics.endFill();
                    }
                    mc.x = rows[i].grid[j].x;
                    mc.y = rows[i].grid[j].y;
                    rows[i].addChild(mc);
                }

                addChild(rows[i]);
                rows[i].y = i > 0 ? rows[(i - 1)].y + rows[(i - 1)].height + 25 : 0;
            }

        }

        private function createGrid($columns:int, $rows:int, $xSpacing:int, $ySpacing:int, $xPadding:int, $yPadding:int, $leftToRight:Boolean = true):Array
        {
            var arr:Array = new Array();
            var pt:Point;
            var row:Number;
            var col:Number;
            var num:int = ($columns * $rows);

            for (var i:int = 0; i < num; i++)
            {
                pt = new Point();

                if ($leftToRight)
                {
                    row = (i % $columns);
                    col = Math.floor(i / $columns);

                    pt.x = (row * ($xSpacing + $xPadding));
                    pt.y = (col * ($ySpacing + $yPadding));
                }
                else
                {
                    row = (i % $rows);
                    col = Math.floor(i / $rows);

                    pt.x = (col * ($xSpacing + $xPadding));
                    pt.y = (row * ($ySpacing + $yPadding));
                }

                arr.push(pt);
            }

            return arr;
        }

    }

}

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

Вы жестко закодировали количество столбцов до 3

rows[i].grid = createGrid(3, totRows, 85, 85,25, 25);

Измените его на:

rows[i].grid = createGrid(xml.navitem[i].person.length(), totRows, 85, 85,25, 25);

Кстати, рассмотрите возможность использования

for(i = 0; i < xml.navitem.length(); i++)

вместо

for (i in xml.navitem)

и вводим переменные вроде var i:Number;

В настоящее время значения i представляют собой строки типа "0", "1" - это приведет к ошибкам в неожиданных точках, которые могут быть трудно отладить.

обновление: Инициализируйте количество строк в одну вместо нуля:

var totRows:Number = 1;
1 голос
/ 28 ноября 2009

Я нашел свой ответ. Пришлось изменить условные утверждения как таковые:

var totRows:int;
if (xml.navitem[i].person.length() % 3 == 0){
    totRows = xml.navitem[i].person.length() / 3;
} else {
totRows = xml.navitem[i].person.length() / 3 + 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...