如何在不是我的主类而不是显示对象的类中访问Actionscript 3中的舞台?
答案 0 :(得分:3)
简单来说,您可以将其保存在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...
}
}
答案 1 :(得分:2)
答案 2 :(得分:1)
Adobe无法提供对舞台的静态访问,因此您无法自行实施。
这是一个史诗般的失败,因为在主文档类实例构造函数运行之前无法访问该阶段以将某个阶段实例存储在某个任意静态变量中。
由于每次想要静态访问舞台时都必须初始化该任意静态变量,因此最好确保只需要执行一次。
为确保您只需要初始化一次,您必须确保您所写的每个静态方法指向该变量,并且在初始化之前不会尝试访问它。
考虑到所有......最合乎逻辑的步骤是: 1.使用Adobe NOW提交功能请求。 2.创建一个“全局”或“文档”基类,为您初始化一个静态阶段变量,并让所有文档类继承它。扩展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的静态访问权限,它将更容易修复。只需用Adobe提供的任何内容替换“Document.sstage”即可。
答案 3 :(得分:0)
您可以使用accessor和mutator类来设置和检索舞台实例吗?