【问题标题】:AS3: How do I access a variable from a parent object?AS3:如何从父对象访问变量?
【发布时间】:2016-03-04 12:19:48
【问题描述】:

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

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

总而言之,我需要从父类访问一个变量,但我尝试过的每一种方法都只会返回一个错误。

抱歉,如果这有点不清楚,任何帮助将不胜感激!

【问题讨论】:

  • 如果您的 ArrowPlayer 实例是兄弟,那么您将在 Arrow 类中执行以下操作(在它被添加到阶段之后):var player:Player = MovieClip(parent).playerInstance; - playerInstance 是播放器的实例名称(或变量名称)。
  • 你弄明白了吗?
  • 是的,我确实让它工作了。有效!感谢您的帮助!

标签: actionscript-3 flash


【解决方案1】:

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

Level.playerX = 0;

因为 Level 是一个类,而 playerX 是该类的变量。

我不能这样做:

Object(parent).playerX

因为 'parent' 不是类并且没有名为 'playerX' 的变量,所以 parent 可能是类 'Level' 的实例,但类 'Level' 的实例没有名为 'playerX' 的变量,类本身“Level”就是具有该变量的类。

【讨论】:

    【解决方案2】:

    听起来您正在使用 FlashPro 时间线,并且有两个兄弟对象(它们具有相同的父影片剪辑/时间线)并且您希望能够从另一个引用一个(如果这不能正确总结您的问题)。

    由于听起来您的 ArrowPlayer 类附加了类文件,因此您需要确保运行任何引用 parentstageroot 变量的代码 在项目被添加到显示列表之后,因为这些变量仅在项目被放到舞台上后才会填充。 (这不是时间线代码的问题)。

    所以,是这样的:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2013-04-28
      • 2012-03-02
      相关资源
      最近更新 更多