如何从 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 上。

至少有两个很好的理由:

  1. 您的 Game class 需要扩展 MovieClip 以拥有方法 stop()gotoAndPlay()addChild()stage属性。例如 class Game extends MovieClip 会给你那些方法。
  2. 即使您的 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();