【问题标题】:as3 access stage info from subclasses and packagesas3 访问来自子类和包的阶段信息
【发布时间】:2016-09-01 16:26:03
【问题描述】:

我正在尝试用 as3 制作游戏。我所有的代码都在这里https://github.com/raphydaphy/LightStage/,当我尝试运行它时,我得到了一些错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at backend/prepGame()[~/LightStage Beta/src/backend.as:412]
at LightStage/keyHandler()[~/LightStage Beta/src/LightStage.as:99]

基本上就是这一行(在backend.as中,这是一个包:

LightStage.instance.gotoAndStop(2);

这里调用(在 LightStage.as 中,即文档类):

G.vars.backend.prepGame();

我知道问题是我无法访问 LightStage 文档类的 gotoAndStop 方法。我已经搜索了很远,但什么也没找到。

我已经能够通过在文档类 (LightStage.as) 中编写的这个访问舞台:

G.vars._stage = stage;

但是,如上所述,尝试更改主时间线的框架失败了。

【问题讨论】:

    标签: actionscript-3 flash scope closures stage


    【解决方案1】:

    就像听起来一样。使用调试面板(调用堆栈和变量),您应该会看到代码在抱怨什么。

    因为您将LightStage 作为静态类访问,所以我添加了一个局部变量以在调试器中提供类范围。如您所见,instance 是一个空对象。

    再往后一步,进入LightStage.keyhandler(),您会发现相同的证据:instance 从未设置过。

    在我找到解决方案之前,请注意以下几点:

    • 虽然LightStage 是您的文档类,但它也是您的MainTimeline(又名root
    • Stage 不等于 MainTimeline
    • AS3 没有静态类,只有静态属性。因此,除非一个方法或属性被显式声明为静态,否则您不能在没有首先实例化类的情况下访问它。这就是为什么您在我们的 localLightStage 变量上只能看到 2 个属性的原因。从 backend 的角度来看,这些是唯一可用的静态属性。

    您可以使用a number of avenues 来获取您的数据,但考虑到您的应用程序的成熟度,不平衡的解决方案将是:

    1. 将您从 backend 访问的属性和方法设为静态。
    2. 将实例化的LightStage 的引用传递给backend 并将其存储为变量。

    在你的情况下,我会选择后者。

    LightStage 的第 68 行之后添加以下内容:G.vars._root = this;

    prepGame() 替换为以下内容:

    public function prepGame(): void
    {
        G.vars._root.setFrame(2); // Go to second frame 'LightStage is starting..'
    
        var startGameTimer:Timer = new Timer(3000, 1); // prepare a one second timer to start the game
        startGameTimer.addEventListener(TimerEvent.TIMER, G.vars._root.game); // create a listner for the timer
        startGameTimer.start(); // start the timer
    }
    

    这将解决您当前的问题。之后,您会发现其他错误。

    替换 backend.as 中的第 142 行(具有运行条件),如下所示:

    if (G.vars.lines[lineNum].G.vars._stage &&

    并替换为:

    if (G.vars.lines[lineNum] &&

    backend.as 的第 256 行,您正在访问 G.vars.badges.checkBadges();,但是,在 LightStage 的第 50 行,您将实例化的类替换为一个数组:G.vars.badges = [];。删除该行。

    此外,只要您将第 256 行指定为 private,就无法访​​问该函数。将badges.as的第58行改为:public function checkBadges(): void

    【讨论】:

    • 非常感谢!你解决了我的问题!!我没有足够的代表,但如果可以的话,我会投票赞成:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多