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 获取您的数据,但考虑到您应用的成熟度,不平衡的解决方案将是:
- 将您从
backend
访问的属性和方法设为静态。
- 将实例化
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
我正在尝试用 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 toMainTimeline
- AS3 没有静态 classes,只有静态属性。因此,除非方法或 属性 被显式声明为静态的,否则您不能在不先实例化 class 的情况下访问它。这就是为什么您在我们的
localLightStage
变量上只看到 2 个属性。从backend
的角度来看,这些是唯一可用的静态属性。
您可以 a number of avenues 获取您的数据,但考虑到您应用的成熟度,不平衡的解决方案将是:
- 将您从
backend
访问的属性和方法设为静态。 - 将实例化
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