0

我已经尝试了很多小时,编码和搜索我的问题的解决方案没有任何效果。

错误:TypeError:错误 #1009:无法访问空对象引用的属性或方法。

简介:我正在创建一个游戏,一直在开发一个随机间隔的背景云生成器,其中一个想法是让云在她的寿命达到 0 后消失(我们从 100 倒计时到 0)。项目为 30 FPS。有趣的是,导致错误的云消失了(也许它仍然存在,但 alpha 为 0?)但是下一个云,不给出任何错误,一切正常。

所以现在是一些代码和解释的时候了:

GAME CLASS - 文档类

// VARIABLES
    var clouds:Clouds = new Clouds(); 
    static var cloudsTimerDelay:Number = 3000;
    static var cloudsTimer:Timer = new Timer(cloudsTimerDelay);

// CONSTRUCTOR
    cloudsTimer.addEventListener("timer", spawnCloud);
    cloudsTimer.start();

// CALLED FUNCTION
    function spawnCloud(e:Event){
        stage.addChildAt(new Clouds,1);
    }

云级

// VARIABLES
    var fadeSpeed:Number = 0.05;
    var lifeSpan:Number = 100;

// CONSTRUCTOR
    addEventListener("enterFrame", enterFrame);

// CALLED FUNCTIONS
    function enterFrame(e:Event)
    {
        this.lifeSpan--;
        this.x +=  this.velocity;

        if (this.lifeSpan < 0)
        {
            this.alpha -=  this.fadeSpeed;
            if (this.alpha <= 0)
            {
                kill(); // ERROR IN THIS FUNCTION
            }
        }

    }


    function kill()
    {
        removeEventListener("enterFrame", enterFrame);
        stage.removeChild(this); // ERROR ERROR ERROR
    }

我在上面标记了错误位置,它是导致问题的 stage.removeChild(this) (这就是调试器所说的)。这段代码的主要思想是在设置的时间间隔(计时器部分)上在舞台上创建对象,当它被创建时,对象开始是它自己的 enterFrame 函数。它用于移动云,每帧从生命周期中减去1,当它达到0时,淡入淡出以恒定值改变alpha值,当alpha低于0时,kill函数应该进入,摆脱事件监听器和从舞台上删除云。任何想法为什么会发生此错误?我将非常感谢任何解决方案!如果我写得不好,我也非常抱歉,但这是我在 Stack 上的第一篇文章 :)

干杯!

4

1 回答 1

0

好的,正如我在评论中所说,问题出在Game类中

var clouds:Clouds = new Clouds();

这个 var 实际上从未添加到舞台上,但它仍然具有所有其他属性。因此,当它的 alpha 达到 0 时,它会调用它的kill()函数,该函数会请求该DisplayObject.stage属性,该属性为 null(因为它从未添加到阶段)。错误中提到的您无法访问的属性是removeChild.

请记住,当您stage在一个DisplayObject类中引用它时,它意味着它自己的stage属性。除非您将您添加到舞台,否则该班级无法知道您正在使用DisplayObject的舞台。这意味着this.stage有时可以null

于 2013-11-10T01:09:37.140 回答