运行时出现Type Coercion failed错误,请求排查解决
嘿,这个错误我之前做AS3动画的时候也碰到过!咱们先把问题拆透:你看到的Type Coercion failed: cannot convert []@13a355b9 to flash.display.DisplayObject,说白了就是你传给removeChild()的不是显示对象,而是一个空数组——也就是说circlearray1[i][0]这个位置存的东西根本不是你以为的Shape或者其他DisplayObject,而是个数组。
第一步:先搞清楚数组里到底存了啥
先在调用removeChild的前一行加个调试输出,看看真实情况:
trace("circlearray1["+i+"][0]的类型:" + getQualifiedClassName(circlearray1[i][0])); trace("具体内容:" + circlearray1[i][0]);
十有八九你会看到输出是Array或者空数组,这说明你在填充circlearray1的时候,某个环节把数组当成显示对象存进去了——比如写残影逻辑时,误把new Shape()包进了数组里,或者数组嵌套层级写错了。
第二步:给移除逻辑加个“安全锁”
就算数组内容没问题,也可能因为残影已经被移除、索引越界导致报错。给你一个稳一点的写法,把类型校验和父级判断都做全:
var target:DisplayObject = circlearray1[i][0] as DisplayObject; if (target && target.parent) { target.parent.removeChild(target); // 移除后记得把数组对应位置置空,避免下次再取到无效对象 circlearray1[i][0] = null; }
这里用as做安全转换,如果circlearray1[i][0]不是DisplayObject,target会变成null,直接跳过移除操作,就不会触发类型转换错误了。
第三步:排查残影生成的逻辑漏洞
你要做的是最外层圆的残影效果,常见的实现是每隔一段时间复制圆的实例或者绘制新Shape到舞台。如果残影是存在circlearray1里,很大概率是添加残影时写错了存储逻辑——比如本来应该存new Shape(),结果写成了[new Shape()],导致circlearray1[i][0]变成了数组。
举个反例,错误的写法可能是这样:
// 错误:把数组存进了子元素里 circlearray1[i].push([new Shape()]);
正确的应该是直接存显示对象:
// 正确:存储单个显示对象 circlearray1[i].push(new Shape());
最后提个小提醒
既然用的是二维数组circlearray1,建议在初始化和每次修改时,明确每个层级的存储类型——比如第一层是圆的分组,第二层是圆本身和它的残影对象,这样能避免嵌套层级搞混,减少这类低级错误~
内容的提问来源于stack exchange,提问作者Dimentio

