AS3 Error2025求助:removeChild移除partsArr元素时提示子对象异常
关于AS3贪吃蛇游戏中Error2025错误的求助
我是AS3新手,正在时间轴中编写一款贪吃蛇游戏,为什么调用removeChild(partsArr[i])时会触发Error2025错误?错误提示是:The supplied DisplayObject must be a child of the caller。我觉得错误指向partsArr[i],但对DisplayObject的父子关系概念不太熟悉。
编辑补充
我不确定具体修改了什么,但问题现已解决,考虑删除该帖子。问题可能并非完全由Error2025导致,我只是移除了其他函数中的部分代码后,程序就正常运行了,抱歉。
相关代码片段
var partsArr:Array = new Array(); //存储蛇头和身体部件 function ini():void { //从库中获取并放置蛇头 head = new Head(); addChild(head); //将蛇头加入部件数组 partsArr.push(head); //每次新游戏开始时随机生成蛇头位置 headX = Math.ceil(((stage.stageWidth-headWidth)/(headWidth))*Math.random())*headWidth; headY = Math.ceil((((stage.stageHeight-hudHeight) - headWidth)/(headWidth))*Math.random())*headWidth; } function newFood():void { foodX = Math.ceil(((stage.stageWidth-foodWidth)/(foodWidth))*Math.random())*foodWidth; foodY = Math.ceil((((stage.stageHeight-hudHeight)-foodWidth)/(foodWidth))*Math.random())*foodWidth; food.x = foodX - foodWidth/2; food.y = foodY - foodWidth/2; //当食物与蛇身或其他食物重叠时,重新生成位置 for (var i:int = partsArr.length-1;i > 0; i--) { if(food.x == partsArr[i].x && food.y == partsArr[i].y) { newFood(); } if(food.x == enemyfood.x && food.y == enemyfood.y) { newFood(); } if(food.x == dietfood.x && food.y == dietfood.y) { newFood(); } if(food.x == passfood.x && food.y == passfood.y) { newFood(); } } } function hideGrid(event:MouseEvent):void { //用缩进保持代码结构清晰 if (WholeGrid) { WholeGrid.visible = false; } cleanup(); } function cleanup():void { removeChild(head); removeChild(food); removeChild(enemyfood); removeChild(dietfood); removeChild(passfood); removeChild(portal); for (var i:int = 0; i < partsArr.length; i++) { //从舞台移除蛇部件 removeChild(partsArr[i]); } partsArr = []; }
问题解析与解决办法
Error2025的核心原因是:你尝试移除的显示对象,并不是当前调用removeChild()的容器的子元素。看你的代码,问题出在cleanup()函数里:
- 你先单独调用
removeChild(head),但head已经被加入partsArr数组,后面循环又会再次尝试移除它,这时候head已经不在容器里了,直接触发错误。 - 另外,数组中可能存在其他已经被移除但未从数组中删除的元素,也会导致重复移除报错。
修复方案
- 删除
cleanup()中单独的removeChild(head),因为head已经在partsArr里,循环会处理它。 - 移除元素前先通过
contains()方法判断它是否属于当前容器,避免无效移除:
function cleanup():void { // 处理各类食物时也加判断,防止重复移除报错 if(contains(food)) removeChild(food); if(contains(enemyfood)) removeChild(enemyfood); if(contains(dietfood)) removeChild(dietfood); if(contains(passfood)) removeChild(passfood); if(contains(portal)) removeChild(portal); for (var i:int = 0; i < partsArr.length; i++) { if(contains(partsArr[i])){ removeChild(partsArr[i]); } } partsArr = []; }
- 日常维护数组时,显示对象被移除后要及时从数组中删除,避免数组残留无效引用。
内容的提问来源于stack exchange,提问作者webdog
相关产品推荐
相关产品推荐

