我有這樣的代碼,它可以完美地工作,但偶爾 - 每當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必須的孩子來電 ??
它會說如果你在調試播放器中運行它,你會看到完整的堆棧跟蹤,無論是在彈出窗口還是在控制檯(取決於你如何運行它)。看起來你的問題是你有一個靜態方法返回所有的shs,並且我會願意讓你的代碼以某種方式滑入sh中,該sh不再位於顯示列表中,或者屬於不同的父類,可能甚至是具有相同名稱的不同實例。在調試器中查看父節點的內存地址與當前的vex。 –
嗯,是的,我還可以檢查父母== vex,不需要查看十六進制地址。我會,並且會將結果發回到這裏 –
嗯,是的,你是對的,我正在創建一個新的「vex」,但靜態數組: var shs:Array = SurfaceElement.NumberToAllSH [dolly]; 包含對屬於舊「vex」的「舊」SurfaceElements的引用。 一個人必須密切關注靜態引用,如果你不用手工去做,它們不會被破壞......你可以將你的評論轉換成答案,以便我可以授予它。 –