2013-06-01 26 views
0

我有這樣的代碼,它可以完美地工作,但偶爾 - 每當Flash認爲如此 - 它崩潰。下面是生成的調試文本:getChildIndex固有的Flash錯誤

Error #2025

showResult:true

dolly = 10

Dolly added

Generic Chips added

Highlighting SH:[object SurfaceElement]10-[object TSprite]-vex!

ArgumentError: Error #2025

請注意「vex!」是對象vex的名稱,它是一個TSprite(= Sprite)。

public function update(players:Array, showResult:Boolean = false):void { 
     try { 
      var debug:String = "showResult:" + showResult.toString() + "\n"; 
      debug += "dolly = " + dolly.toString(); 

      // RESET columns 
      columns.length = 0; 
      billboards.removeAllChildren(); 
      var column:ChipColumn; 

      // add dolly 
      var alfa:Number = 1; 
      if (showResult) { 
       column = getChipColumn(vex.getChildIndex(numberToSH[dolly])); 
       column.addChild(dollySpr); 
       alfa = LOSER_ALPHA; // fade-out (non-animated) non-winning columns 
      } 

      debug += "\nDolly added"; 

      for (var k:* in players) { 
       var player:Player = players[k]; 
       var bets:Array = player.getBets(); 
       for (var i:* in bets) { 

        // is there a column already for these chips? 
        column = getChipColumn(i); 
        column.alpha = alfa; // loser..? 
        for (var j:int = bets[i]; j > 0; --j) { 
         var bmp:TBitmap = new TBitmap(chips[k], Align.CENTER, Align.CENTER); 
         bmp.y = - column.numChildren * 5; 
         column.addChild(bmp); 
        } 
       } 
      } 

      debug += "\nGeneric Chips added"; 

      if (showResult) { 
       var shs:Array = SurfaceElement.NumberToAllSH[dolly]; 
       for each (var sh:SurfaceElement in shs) { 
        debug += "\nHighlighting SH:" + String(sh); 
        debug += sh.corresponds.toString(); 
        debug += "-" + String(sh.parent); 
        debug += "-" + String(sh.parent.name); 

        column = getChipColumn(vex.getChildIndex(sh)); // ERROR LINE ?!? 
        column.alpha = 1; // restore alpha 
        column.filters = [new GlowFilter(0xffffff, 1, 12, 12, 3, 3)]; 
       } 
      } 

      debug += "\nEnd of Highlighting !!!!!!"; 

      // sort columns by y 
      var sorted:Array = columns.sortOn("sortY", Array.NUMERIC | Array.RETURNINDEXEDARRAY); 
      debug += "\n" + sorted.toString(); 
      for (i in sorted) { 
       column = columns[sorted[i]]; 
       if (!column) break; // pointers to undefined data have arrived (put last) 
       billboards.addChild(column); 
      } 
      debug += "\nEnd of ALL"; 
     } catch(e:Error) { 
      if (!Debug.field.text.length) { 
       Debug.field.textColor = 0xffffff; 
       Debug.field.appendText(e.message + "\n" + debug + "\n" + e.toString()); 
      } 
     } 
    } 

    private function getChipColumn(i:int):ChipColumn { 
     var column:ChipColumn = columns[i]; 
     if (!column) { 
      column = new ChipColumn(); 

      // calc column properties 
      var sh:SurfaceElement = vex.getChildAt(i) as SurfaceElement; 
      var point:Point = sh.getCenterProjected(); 
      point = billboards.globalToLocal(point); 

      column.sortY = sh.center.y; 
      column.x = point.x; 
      column.y = point.y; 
      columns[i] = column; 
     } 
     return column; 
    } 

從調試的文字,很明顯的錯誤在這裏發生了:

debug += "\nHighlighting SH:" + String(sh); 
debug += sh.corresponds.toString(); 
debug += "-" + String(sh.parent); 
debug += "-" + String(sh.parent.name); 
column = getChipColumn(vex.getChildIndex(sh)); // ERROR LINE ?!? 

錯誤2025發生在getChildIndex被調用非子對象。但SHIS煩惱的孩子的父母的名字所暗示(VEX!)。並且只有ONEvex

另一個特有的事情是,該錯誤消息(e.message)簡單地生產: 錯誤2025 而錯誤到字符串(e.toString())產生: 引發ArgumentError:錯誤#2025

難道不應該說更像是:

引發ArgumentError:錯誤#2025:提供的DisplayObject必須的孩子來電 ??

+1

它會說如果你在調試播放器中運行它,你會看到完整的堆棧跟蹤,無論是在彈出窗口還是在控制檯(取決於你如何運行它)。看起來你的問題是你有一個靜態方法返回所有的shs,並且我會願意讓你的代碼以某種方式滑入sh中,該sh不再位於顯示列表中,或者屬於不同的父類,可能甚至是具有相同名稱的不同實例。在調試器中查看父節點的內存地址與當前的vex。 –

+0

嗯,是的,我還可以檢查父母== vex,不需要查看十六進制地址。我會,並且會將結果發回到這裏 –

+1

嗯,是的,你是對的,我正在創建一個新的「vex」,但靜態數組: var shs:Array = SurfaceElement.NumberToAllSH [dolly]; 包含對屬於舊「vex」的「舊」SurfaceElements的引用。 一個人必須密切關注靜態引用,如果你不用手工去做,它們不會被破壞......你可以將你的評論轉換成答案,以便我可以授予它。 –

回答

1

靜態全局狀態是bad thing。在這種情況下,你無法知道從靜態數組中檢索到的sh對象是否與當前的「vex」對象有關。

而不是讓SurfaceElement跟蹤已添加的所有本身的實例,請考慮讓您的Vex類暴露surfaceElements數組(或更好,Vector)。如果這些都建立在舞臺上(我懷疑你跟蹤他們,因爲靜態你沒有與時間軸/舞臺對象工作良好的「手柄」),那麼你可以做這樣的事情在你的構造:

 
public var surfaceElements:Array = []; 
function Vex() { 
    super(); 
    var loops:int = numChildren; 
    for (var i:int=0; i<loops; i++) { 
     var surface:SurfaceElement = getChildAt(i) as SurfaceElement; 
     if (surface) { 
      surfaceElements[surfaceElements.length] = surface; 
     } 
    } 
} 

然後,當您正在使用特定的VEX做,你也以其surfaceElements沒有交叉進行。