为什么我的对象变为空,我该如何解决这个问题呢?

时间:2013-08-09 01:50:16

标签: flash object actionscript null

在此代码中可以:

package GameFiles.SourceCode.Classes
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;

public class User extends MovieClip
{
    private var numStars:int = 65;
    public static var enemyList:Array = new Array();
    private var ourShip:Ship;
    private var scoreHUD:ScoreHUD;

    public function User() : void
    {

        var ourShip:Ship = new Ship(stage);
        stage.addChild(ourShip);

        ourShip.x = stage.stageWidth / 2;
        ourShip.y = stage.stageHeight / 2;
        ourShip.addEventListener("hit", shipHit, false, 0, true);
        scoreHUD = new ScoreHUD(stage);
        stage.addChild(scoreHUD);

        for (var i:int = 0; i < numStars; i++)
        {
            stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip));
        }

        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);

    }
    private function loop(e:Event) : void
    {
        if (Math.floor(Math.random() * 90) <= scoreHUD.s_score / 100)
        {
            var enemy:Astroid = new Astroid(stage, ourShip);
            enemy.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true);
            enemyList.push(enemy);
            enemy.addEventListener("Passed", enemyPassed, false, 0, true);
            stage.addChild(enemy);              
        }
    }
    public function shipHit(e:Event) : void
    {
        scoreHUD.updateHits(e.currentTarget.points);
        ourShip.updateHitCount(1);
    }
    public function enemyPassed(e:Event) : void
    {
        scoreHUD.updateScore(10);
    }

    private function removeEnemy(e:Event)
    {
        enemyList.splice(enemyList.indexOf(e.currentTarget), 1);
    }   
}   
}

变量ourShip被定义为对象发货(我可以为大部分代码追踪这个)但是当我到达shipHit函数并尝试引用ourShip进行调整时我的船类中的一个变量,它表示它为空,我得到一个错误。我不明白为什么它变成了null,我认为代码的特定部分是更新变量的最佳位置。我已经在scoreHUD内更新了一个类似的变量。

2 个答案:

答案 0 :(得分:0)

几点提示:

变化

public static var enemyList:Array = new Array();

public static var enemyList:Array = [];

效果相同,但速度更快。

其次,我认为你没有理由在你的听众中使用弱引用:

ourShip.addEventListener("hit", shipHit, false, 0, true);

改为:

ourShip.addEventListener("hit", shipHit);

与您添加的其他侦听器(FRAME_ENTER)相同。 侦听器中的弱引用只是意味着当垃圾收集器运行时将删除侦听器,因此您没有未使用的对象占用的任何内存。此外,如果对象至少有一个活动侦听器,则无法将其删除。

所以你创建了大量的星星,内存被占用,你的app运行几个周期,Flash Player决定进行垃圾收集运行,清除所有弱侦听器,你有指向空对象引用的指针。 / p>

这是我的猜测,删除弱引用,看看会发生什么;)

答案 1 :(得分:0)

我会改变这一行(在你的构造函数中):

var ourShip:Ship = new Ship(stage);

ourShip = new Ship(stage);

我相信我们正在创建myShip的本地范围实例,它不会存在于构造函数之外。