如何从非文档类调用stage对象?

时间:2010-09-01 14:58:25

标签: flash actionscript class

我面临的问题是我试图在不是文档类的类中操作(在这种情况下添加eventListeners)对象(在本例中为一些MovieClip)。

1120: Access of undefined property trans.

现在我知道它可能是一个范围的东西,我可能无法直接从非文档类访问阶段对象(正如我在下面的代码中所做的那样)但我无法弄清楚如何正确访问它们。我已经坚持了几个小时这个问题,我已经阅读了很多关于类似问题的解决方案和有关范围相关问题的解释,但我仍然没有找到解决方案。我希望现在有人可以帮助我。

无论如何,这是交易:

我的舞台上有一个名为“trans”的动画片段中有3个动态文本字段(称为“NL”,“FR”和“EN”)。我正在尝试在第二个类中添加eventlisteners以使它们在单击时执行某些操作。

这是我的文档类:

package {

  import flash.display.MovieClip;

  // Import custom classes.
  import classes.Translate;

  public class Main extends MovieClip {

    // Init Translation class on load.
    public var translate:Translate = new Translate();

    public function Main() {

    }

  }
}

这是我的自定义类Translate(位于子文件夹“classes”中)。

package classes {

  import flash.display.MovieClip;
  import flash.events.MouseEvent;

  public class Translate extends MovieClip {

    public function Translate() {

      // Init translation eventListeners.
      trans.NL.addEventListener(MouseEvent.CLICK,
        function(event:MouseEvent):void {
          loadNl();
        }
      );

      trans.FR.addEventListener(MouseEvent.CLICK,
        function(event:MouseEvent):void {
          loadFr();
        }
      );

      trans.EN.addEventListener(MouseEvent.CLICK,
        function(event:MouseEvent):void {
          loadEn();
        }
      );
    }

    public function loadNl() {
      trace("NL");
    }

    public function loadFr() {
      trace("FR");
    }

    public function loadEn() {
      trace("EN");
    }

  }
}

提前感谢您花时间帮助我。

3 个答案:

答案 0 :(得分:1)

斯科特你说得对,但它可以更简单。这就是我的工作:

public class Main
{

    public static var STAGE:Stage

    public function Main()
    {
        STAGE = this.stage;
    }
}

从那时起,我就可以从任何地方使用Main.STAGE。

答案 1 :(得分:1)

对不起,我还没有回答我自己的问题。

我正在寻找的解决方案相当简单,并且主要倾向于Ben的答案。

基本上我想在其他类中使用我的Main类。我只需要将它的引用发送给新对象的类构造函数。

package {

  import flash.display.MovieClip;

  // Import custom classes.
  import classes.Translate;

  public class Main extends MovieClip {

    private var _instance:MovieClip;

    public function Main() {
      _instance = this;

      var trans:Translate = new Translate(_instance);
    }
  }
}

现在我可以通过这个引用引用我的Main类和stage对象。

package classes {

  import flash.display.MovieClip;

  public class Translate {

    private var _main:MovieClip;

    public function Translate(main:MovieClip) {
      _main = main;

      // Trace the amount of stage objects.
      trace(_main.stage.numChildren); 
    }
  }
}

感谢Ben和Scott帮忙。

答案 2 :(得分:0)

您需要设置对Stage / Document Class的引用。您可以使用另一个类来存储引用,即StageReference。在Main构造函数中,您可以设置对Stage的引用,然后可以通过静态方法调用它。

    public class StageReference
{

    private static var _stage:Stage
    private static var _root:MovieClip;

    static public var INSTANCE:StageReference;

    public function StageReference():void
    {
    }

    static public function addStage( stageObj:Stage ):void
    {
        _stage = stageObj;
    }
    static public function addRoot( rootObj:MovieClip ):void
    {
        _root = rootObj;
    }

    static public function getStage():Stage
    {
        return( _stage );
    }

    static public function getRoot():MovieClip
    {
        return( _root );
    }
}  

// Main Class
public function Main() { 
   StageReference.addStage(stage); 
   StageReference.addRoot(this) 
 }

// Translate Class
public function Translate() { 
   var stage:Stage = StageReference.getStage();
   stage.trans.NL.addEventListener.....
}