我有一个相当简单的计时器事件,它降低了对象数组中所有元素的不透明度:
public function onShadowFade(timerEvent:TimerEvent):void
{
for each (var newShadow:Shadow in shadows)
{
newShadow.alpha -= 0.02;
if (newShadow.alpha <= 0)
{
newShadow.parent.removeChild(newShadow);
}
}
}
每次尝试时都会收到以下错误消息:
类型错误: 错误 #1009: 无法访问空对象引用的属性或方法
据我所知,此问题可能是由以下原因引起的:
- 不声明实例(我在上课开始时这样做)
- 实例名称拼写错误,因此引用未定义的对象(已选中)
我不确定是什么导致了这个问题。
为了调试问题,我添加了一行代码来跟踪我的数组 - 阴影 - 每次运行:
trace(shadows);
这将返回类似于以下内容的列表:
[对象阴影],[对象阴影],[对象阴影]等
我认为这证明我引用的对象不是空对象,那么还有什么问题呢?
新增信息
影子对象是使用以下代码创建的:
var newShadow:Shadow = new Shadow();
shadows.push(newShadow);
newShadow.x = shadowX;
newShadow.y = shadowY;
addChild(newShadow);
问题是您正在尝试删除显示对象,尽管它可能不再存在。
为避免这种情况,您有两种选择
- 将其从阵列中删除,然后将其从显示列表中删除
- 检查它是否仍在包含(...)的显示列表中,并且仅在存在时才将其删除。
基本上是这样的。
选项 1)
if (newShadow.alpha <= 0)
{
shadows.splice(IndexOf(newShadow), 1);
newShadow.parent.removeChild(newShadow);
}
选项 2)
if (newShadow.alpha <= 0)
{
if(newShadow.parent.contains(newShadow){
newShadow.parent.removeChild(newShadow);
}
}