Как вызвать объекты сцены из класса, не являющегося документом? - PullRequest
0 голосов
/ 01 сентября 2010

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь манипулировать (в данном конкретном случае добавить eventListeners) объектами (в данном случае некоторыми MovieClips) на сцене из класса, который не является классом документа.

1120: Access of undefined property trans.

Теперь я знаю, что это, вероятно, область действия, и я, вероятно, не могу получить доступ к объектам сцены напрямую из класса, не являющегося документом (как я делаю в приведенном ниже коде), но я не могу понять, как получить к ним правильный доступ. , Я застрял с этой проблемой в течение нескольких часов, и я прочитал много решений подобных проблем и объяснений проблем, связанных с областью действия, но я все еще не нашел решение. Теперь я надеюсь, что кто-то здесь может мне помочь.

Во всяком случае, вот сделка:

У меня есть 3 динамических текстовых поля (называемых «NL», «FR» и «EN») на моей сцене в мувиклипе «trans». Я пытаюсь добавить списки событий во второй класс, чтобы заставить их что-то делать при нажатии.

Вот мой класс документов:

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 ]

1 голос
/ 02 сентября 2010

Скотт, ты прав, но это может быть проще. Вот что я делаю:

public class Main
{

    public static var STAGE:Stage

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

С этого момента я просто использую Main.STAGE из любого места.

1 голос
/ 11 октября 2010

Извините, я еще не ответил на свой вопрос.

Решение, которое я искал, довольно простое и в основном опирается на ответ Бена.

По сути, я хотел использовать свой основной класс в других классах. Мне просто нужно отправить ссылку на него в конструктор класса нового объекта.

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);
    }
  }
}

И теперь я могу ссылаться на мой основной класс и объекты сцены по этой ссылке.

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); 
    }
  }
}

Спасибо Бену и Скотту за помощь.

0 голосов
/ 01 сентября 2010

Вам необходимо установить ссылку на класс рабочей области / документа.Вы можете использовать другой класс для хранения ссылки, например, StageReference.В конструкторе Main вы устанавливаете ссылку на рабочую область, а затем она может вызываться статическим методом.

    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.....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...