【问题标题】:why is my object becoming null, and how should I address this?为什么我的对象变为空,我应该如何解决这个问题?
【发布时间】:2013-08-09 01:50:15
【问题描述】:

在这段代码中没问题:

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 中更新了一个类似的变量。

【问题讨论】:

  • 试过了,我需要在我的代表上做更多的工作才能添加这样一个花哨的标签:)

标签: flash object actionscript null


【解决方案1】:

小贴士:

改变

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 决定执行垃圾收集运行,清除所有弱侦听器,并且您有指向空对象引用的指针。

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

【讨论】:

  • 我想我还没有完全理解弱引用和强引用之间的完全区别。我认为弱引用类似于 var x; (没有提供更多信息,如 int、number、string 或诸如此类,不知道它也扩展到事件侦听器,所以显然这是我需要阅读更多内容的内容。但我确实尝试实现这些更改并正在接收在同一个地方出现同样的错误,ourShip 在某处/不知何故变成了 null。
【解决方案2】:

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

var ourShip:Ship = new Ship(stage);

ourShip = new Ship(stage);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2021-11-01
    • 2017-12-04
    • 2015-06-13
    • 2021-08-18
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多