2009-11-27 60 views
1

嘿傢伙......有數學問題。試圖佈置一個灰色框的網格,我想在其上加載縮略圖。嘗試加載第4個縮略圖時,我不斷收到錯誤消息。如果您刪除了xml中的第4個人節點,它會起作用,但添加第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

你硬編碼的列數到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) 

和輸入變量一樣的ivar i:Number;

目前值是字符串像"0""1" - 它會導致錯誤的突發點和那些可能很難調試。

更新: 初始化行一個,而不是零的數量:

var totRows:Number = 1; 
+1

其實我不得不把它留在3因爲我只想在網格中3列。但排版變量是必須的。 – Preston 2009-11-27 22:29:08

+1

你正在初始化的行數爲零 - 使它成爲一個,它會工作。目前,有四項,傳遞給creategrid方法的行數是1而不是2。 – Amarghosh 2009-11-28 08:36:49

1

我發現我的答案。不得不改變這樣的條件陳述:

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; 
}