AS3:如何从 parent object 访问变量?

AS3: How do I access a variable from a parent object?

我是 AS3 的新手,我的代码可能看起来有点不对。

基本上,我的程序是如何工作的,我在舞台上有一个 "Level" 的实例,它是一个包含其他几个 objects 的 MovieClip,它们也是具有自己文档的 MovieClips class。在 "Level" class 中,我可以从 "Player" 的实例访问 X 和 Y 位置,但在我的 "Arrow" class 中,这也是一个 child 级别,我无法访问 "Player" 的 X 和 Y。我尝试做的是在 Level class 中设置一个名为 playerX 和 playerY 的 public 静态变量,并将其分配给玩家每帧的 x 和 y 位置,然后我尝试访问 Arrow class 通过执行 "var x:Number = Object(parent).playerX,我也试过 MovieClip(parent).playerX 和 parent.playerX只有玩家 X,他们都不起作用。

总而言之,我需要从 parent class 访问一个变量,但我尝试过的每一种方法都只是 returns 一个错误。

抱歉,如果这有点不清楚,我们将不胜感激!

您需要了解什么是静态变量,什么不是。静态变量是 Class 变量,静态变量不是实例变量。因此,如果我在名为 "Level" 的 class 中创建一个名为 "playerX" 的静态变量,我现在可以这样做:

Level.playerX = 0;

因为 Level 是 class 而 playerX 是 class 的变量。

我不能这样做:

Object(parent).playerX

因为 'parent' 不是 class 并且没有名为 'playerX' 的变量,父级可能是 class 'Level' 的实例但是class 'Level' 的实例没有名为 'playerX' 的变量,class 本身 "Level" 就是具有该变量的变量。

听起来您正在使用 FlashPro Timelines,并且有两个兄弟对象(它们具有相同的父对象 MovieClip/timeline)并且您希望能够从另一个对象中引用一个对象(如果没有,请告诉我)无法正确总结您的问题)。

因为听起来你有 class 文件附加到你的 ArrowPlayer classes,你需要确保任何代码引用 parent or stage or root vars 是 运行 AFTER item has been added to the display list as those vars are only populated after该项目已放在舞台上。 (这不是时间线代码的问题)。

所以,像这样:

public class Arrow extends MovieClip {
    public var player:Player; //a var to hold a local reference to the player

    public function Arrow():void {
        //right now parent/stage/root are null
        //listen for the added to stage event, so you know when it's safe to use the parent and stage and root keywords
        this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
    }

    private function addedToStageHandler(e:Event):void {
        player = MovieClip(parent).playerInstanceName;
        //where player instance name is the instance name of your player on the parent timeline
    }

    private function doSomethingWithPlayer():void {
        if(player){
            player.x = 5;
        }
    }
}

现在,如果您想改用静态变量(可能比 parent 关键字更简单),并且只有 1 个播放器实例,您可以执行以下操作:

public class Player extends MovieClip {
    //create a static var to hold a reference to the player instance
    public static var me:Player;

    public function Player():void {
        me = this; //now assign the instance to the static var.
    }
}

现在,您可以通过执行 Player.me(无论上下文如何)从应用中的任何位置访问播放器实例

Player.me.x = 5;