as3 从子类和包中访问阶段信息

as3 access stage info from subclasses and packages

我正在尝试用 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,也就是文档class):

G.vars.backend.prepGame();

我知道问题是我无法访问 LightStage 文档的 gotoAndStop 方法 class。我已经搜索了很久,但一无所获。

我已经能够通过文档中写的这个进入舞台 class (LightStage.as):

G.vars._stage = stage;

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

正如其名。使用调试面板(调用堆栈和变量),您应该可以看到代码在抱怨什么。

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

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

在我进入解决方案之前,请注意以下事项:

  • 虽然 LightStage 是您的文档 class,但它也是您的 MainTimeline (a.k.a. root)
  • Stage is not equal to MainTimeline
  • AS3 没有静态 classes,只有静态属性。因此,除非方法或 属性 被显式声明为静态的,否则您不能在不先实例化 class 的情况下访问它。这就是为什么您在我们的 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 行(具有 运行-on 条件),如下所示:

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

并替换为:

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

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

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