Как получить доступ к сцене в классе, который не является DisplayObject? - PullRequest
2 голосов
/ 28 января 2010

Как получить доступ к сцене в ActionScript 3 в классе, который не является моим основным классом и не является объектом отображения?

Ответы [ 4 ]

3 голосов
/ 28 января 2010

Простой способ, вы можете сохранить его в static var, например:

public class MyMain extends Sprite {
 public static var STAGE:Stage;

 public function MyMain() {
  if (stage)
   init();
  else
   addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
  }
 }

 private function init(e:Event=null):void{
  removeEventListener(Event.ADDED_TO_STAGE, init);
  // store stage reference when stage ready  
  STAGE=stage;
 }
}

и в ваш другой класс импортируйте класс, содержащий статическую переменную, конечно же, переменная должна быть инициализирована перед доступом к ней.

import MyMain;

public class Other {
 public function useStage():void {
   MyMain.STAGE...
 }
}
2 голосов
/ 28 января 2010

самый простой способ - использовать глобальный объект

http://github.com/inruntime/AS3-Global-Object

На этой странице приведены примеры того, как устанавливать и извлекать объекты из любого класса.

1 голос
/ 20 ноября 2012

Adobe не предоставила статический доступ к сцене, и у вас не осталось выбора, кроме как реализовать ее самостоятельно.

Это эпический сбой, поскольку невозможно получить доступ к этапу до того, как ваш конструктор экземпляра класса основного документа запустит для сохранения экземпляра этапа в некоторой произвольной статической переменной.

Поскольку вам придется инициализировать эту произвольную статическую переменную каждый раз, когда вы хотите получить статический доступ к сцене, лучше всего убедиться, что вам придется делать это только один раз.

Чтобы гарантировать, что вам нужно будет только инициализировать его один раз, вам нужно убедиться, что КАЖДЫЙ СТАТИЧЕСКИЙ МЕТОД, который вы когда-либо записывали, указывает на эту переменную и не пытается получить к ней доступ до ее инициализации.

Учитывая все это ... наиболее логичные шаги: 1. Подайте запрос на добавление функций в Adobe NOW. 2. Создайте базовый класс «Global» или «Document», который инициализирует для вас статическую переменную этапа, и все ваши классы документов наследуются от него. Расширение MovieClip дает вам максимальную гибкость:

package
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;
    public class Document extends MovieClip
    {
        public static var _stage:Stage = null;

        public static function get sstage():Stage //added an extra s for "static" to differentiate the static property name from the instance property name "stage"; call it what you want
        {
            return _stage;
        }

        public function Document()
        {
            super();
            if (stage != null)
               initStage( null ); //explicitly pass null to indicate no listener was attached
            else
                addEventListener( Event.ADDED_TO_STAGE, initStage, false, 0, true ); //prefer weak references
        }

        private function initStage( e:Event ):void
        {
            _stage = stage;
            if (e != null) //event listener will be non-null iff listener was added
                removeEventListener( Event.ADDED_TO_STAGE, initStage, false );           
        }
    }
}

Вам не придется писать этот класс более одного раза, если все ваши классы документов расширяют определенный выше класс «Document» (и сразу вызывают «super» в своем конструкторе). Таким образом, код конструктора вашего документа и остальная часть вашего проекта с этого момента будут иметь статический доступ к сцене через «Document.sstage». Статический контекст не может получить доступ к этапу до того, как эта инициализация произойдет в основном классе документов.

Я предлагаю вам принять этот вид согласованности очень рано, потому что это будет легче исправить, если Adobe когда-либо добавит статический доступ к Stage. Это будет просто вопрос замены «Document.sstage» тем, что предоставляет Adobe.

0 голосов
/ 29 января 2010

Вы можете использовать аксессор и класс мутатора для установки и извлечения экземпляра сцены?

...