0

好的,在这段代码中:

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

4

2 回答 2

0

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

var ourShip:Ship = new Ship(stage);

ourShip = new Ship(stage);

我相信这是在创建 ourShip 的本地范围实例,该实例在构造函数之外不存在。

于 2013-08-13T21:22:20.293 回答
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)。侦听器中的弱引用仅意味着当垃圾收集器运行时您的侦听器将被删除,因此您没有任何内存被未使用的对象占用。此外,如果对象至少有一个活动侦听器,则无法将其删除。

所以你创建了大量的星星,占用了内存,你的应用程序运行了几个周期,Flash Player 决定运行垃圾收集,清理所有弱侦听器,你有指向空对象引用的指针。

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

于 2013-08-09T05:33:58.827 回答