as3-错误#1009,一个对象为null,并被计时器窃听



当玩家触摸门时,应该添加下一个级别,并删除上一个级别。然而,在游戏中,下一个级别确实被添加了,一切都正常,但输出显示了这个问题。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.utils::Timer/tick()

这是输入框:

if (player.collisionArea.hitTestObject(door0))
        {
            var timer: Timer = new Timer(1000, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, fade);
            timer.reset();
            timer.start();
        }

这是计时器:

function fade(event: TimerEvent)
    {
        removeEventListener(TimerEvent.TIMER_COMPLETE, fade);
        var pageTwo: PageTwo = new PageTwo;
        parent.addChild(pageTwo);
        this.parent.removeChild(this);
    }

这是在"上一级"课程中。"this"本身(上一级),"pageTwo"是(下一级)。

因此,输出表明错误在"parent.addChild(pageTwo);"。然而,如果我删除了它,输出表明问题来自"this.parent.removeChild(this);

我想这是因为孩子被移除了,这就是为什么会出现无效问题。但是我该如何解决输出中的错误呢?我是不是把电影胶片移错了?

您的问题来自以下行:

parent.addChild(pageTwo);

因为在你的代码中作为这种条件

if (player.collisionArea.hitTestObject(door0))

如果为true,您将创建另一个Timer对象,当其TimerEvent.TIMER_COMPLETE事件被激发时,它将尝试向null父对象添加一个新的PageTwo实例,这就是激发错误的原因。

因此,为了避免这种情况,您可以在条件为true时第一次删除Event.ENTER_FRAME事件侦听器,或者如果您仍然需要它(Event.ENTER_FRAME事件侦听器),则必须验证您的条件以避免这种行为。

此外,您的timer变量应声明为全局变量,以便可以从fade()函数中访问,以便能够从当前对象中删除它的TimerEvent.TIMER_COMPLETE事件侦听器。

希望这能有所帮助。