如何从 AS3 中的外部文件调用特定于时间线的方法?
How can I call timeline-specific methods from an external file in AS3?
我正在创建一个游戏,它是使用 ActionScript 3 的 Flash CS5。为了简化操作,我在源文件夹的顶层创建了一个文件 (Game.as)。我的 Game.as 文件如下所示:
package {
public class Game {
public static function fail():void {
stop();
var restart:RestartButton = new RestartButton();
addChild(restart);
restart.x = stage.stageWidth/2;
restart.y = stage.stageHeight/2;
Game.createButton(restart, function(e:MouseEvent):void { gotoAndPlay (1, "Title Sequence") });
}
}
}
我应该从时间轴上的一个帧调用 Game.fail ()
一个场景,但我得到了这些编译器错误:
Line 11 1180: Call to a possibly undefined method stop.
Line 19 1180: Call to a possibly undefined method gotoAndPlay.
Line 17 1120: Access of undefined property stage.
Line 16 1120: Access of undefined property stage.
Line 14 1180: Call to a possibly undefined method addChild.
为什么会出现这些错误?我能做些什么来修复它们?
提前感谢您的帮助。
问题是 none 这些方法存在于您的 Game
class 上。
至少有两个很好的理由:
- 您的
Game
class 需要扩展 MovieClip
以拥有方法 stop()
、gotoAndPlay()
、addChild()
和 stage
属性。例如 class Game extends MovieClip
会给你那些方法。
- 即使您的
Game extends MovieClip
您不能从 static
范围访问像 stop()
这样的方法,只能从实例范围(即 this
)访问。这是因为 static
scope 本质上是一个全局代码 space 所以这些方法中的 none 是有意义的:当你说 stop()
你必须说 what 实例将停止,例如 this.stop()
或 thatThing.stop()
。静态代码不知道 class 的实例可能存在,因此实例函数无法工作。您需要 Game
class 的实例,而不仅仅是静态函数。
我认为您尝试做的基本上是使用 Game
作为您的主要时间线的 singleton。你可以这样做:
package {
public class Game extends MovieClip {
// global reference to a single instance of the Game
public static game:Game;
public function Game() {
// store a global reference to this instance
// NOTE: bad things will happen if you create more than one Game instance
game = this;
}
// do NOT use static for your methods
public function fail():void {
stop();
var restart:RestartButton = new RestartButton();
addChild(restart);
restart.x = stage.stageWidth/2;
restart.y = stage.stageHeight/2;
createButton(restart, function(e:MouseEvent):void { gotoAndPlay (1, "Title Sequence") });
}
}
}
现在您需要将此 class 设置为您的 document class。文档 class 永远只有一个实例,因此这很适合您。但是,您 可以 link 这个 class 到您库中的一个符号,并通过代码 (new Game()
) 或将时间轴实例放在一个关键帧。
最后,要从任何地方调用Game
方法,您可以使用Game.game
实例:
Game.game.fail();
我正在创建一个游戏,它是使用 ActionScript 3 的 Flash CS5。为了简化操作,我在源文件夹的顶层创建了一个文件 (Game.as)。我的 Game.as 文件如下所示:
package {
public class Game {
public static function fail():void {
stop();
var restart:RestartButton = new RestartButton();
addChild(restart);
restart.x = stage.stageWidth/2;
restart.y = stage.stageHeight/2;
Game.createButton(restart, function(e:MouseEvent):void { gotoAndPlay (1, "Title Sequence") });
}
}
}
我应该从时间轴上的一个帧调用 Game.fail ()
一个场景,但我得到了这些编译器错误:
Line 11 1180: Call to a possibly undefined method stop.
Line 19 1180: Call to a possibly undefined method gotoAndPlay.
Line 17 1120: Access of undefined property stage.
Line 16 1120: Access of undefined property stage.
Line 14 1180: Call to a possibly undefined method addChild.
为什么会出现这些错误?我能做些什么来修复它们?
提前感谢您的帮助。
问题是 none 这些方法存在于您的 Game
class 上。
至少有两个很好的理由:
- 您的
Game
class 需要扩展MovieClip
以拥有方法stop()
、gotoAndPlay()
、addChild()
和stage
属性。例如class Game extends MovieClip
会给你那些方法。 - 即使您的
Game extends MovieClip
您不能从static
范围访问像stop()
这样的方法,只能从实例范围(即this
)访问。这是因为static
scope 本质上是一个全局代码 space 所以这些方法中的 none 是有意义的:当你说stop()
你必须说 what 实例将停止,例如this.stop()
或thatThing.stop()
。静态代码不知道 class 的实例可能存在,因此实例函数无法工作。您需要Game
class 的实例,而不仅仅是静态函数。
我认为您尝试做的基本上是使用 Game
作为您的主要时间线的 singleton。你可以这样做:
package {
public class Game extends MovieClip {
// global reference to a single instance of the Game
public static game:Game;
public function Game() {
// store a global reference to this instance
// NOTE: bad things will happen if you create more than one Game instance
game = this;
}
// do NOT use static for your methods
public function fail():void {
stop();
var restart:RestartButton = new RestartButton();
addChild(restart);
restart.x = stage.stageWidth/2;
restart.y = stage.stageHeight/2;
createButton(restart, function(e:MouseEvent):void { gotoAndPlay (1, "Title Sequence") });
}
}
}
现在您需要将此 class 设置为您的 document class。文档 class 永远只有一个实例,因此这很适合您。但是,您 可以 link 这个 class 到您库中的一个符号,并通过代码 (new Game()
) 或将时间轴实例放在一个关键帧。
最后,要从任何地方调用Game
方法,您可以使用Game.game
实例:
Game.game.fail();