Как получить доступ к stage в классе, который не является DisplayObject?
-
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?