Как получить доступ к stage в классе, который не является DisplayObject?

StackOverflow https://stackoverflow.com/questions/2153111

  •  23-09-2019
  •  | 
  •  

Вопрос

Как мне получить доступ к этапу в Actionscript 3 в классе, который не является моим основным классом и не является displayobject?

Это было полезно?

Решение

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

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

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

Другие советы

Самый простой способ, вы можете хранить его в 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;
 }
}

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

import MyMain;

public class Other {
 public function useStage():void {
   MyMain.STAGE...
 }
}

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

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

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

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

Учитывая все это...наиболее логичными шагами являются:1.Отправьте запрос на дополнительные функции в Adobe ПРЯМО СЕЙЧАС.2.Создайте базовый класс "Global" или "Document", который инициализирует для вас статическую переменную stage, и пусть все ваши классы 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 расширяют указанный выше класс "Document" (и сразу вызывают "super" в его конструкторе).Сделав это, код конструктора вашего документа и остальная часть вашего проекта с этого момента будут иметь статический доступ к этапу через "Document.ssage".У статического контекста нет возможности получить доступ к этапу до того, как эта инициализация произойдет в основном классе document.

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

Вы могли бы использовать accessor и класс mutator для установки и извлечения экземпляра stage?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top