如何访问 Actionscript 3 中不是我的主类且不是显示对象的类中的阶段?
4 回答
简单的方法,您可以将其保存在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...
}
}
Adobe 未能提供对舞台的静态访问,因此您别无选择,只能自己实施。
这是一个史诗般的失败,因为在您的主文档类实例构造函数运行以将阶段实例存储在某个任意静态变量中之前,无法访问该阶段。
由于每次想要静态访问舞台时都必须初始化该任意静态变量,因此最好确保您只需执行一次。
为确保您只需初始化一次,您必须确保您写入的每个静态方法都指向该变量,并且在初始化之前不尝试访问它。
鉴于所有这些......最合乎逻辑的步骤是: 1. 立即向 Adobe 提交功能请求。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.sstage”对舞台进行静态访问。在主文档类中发生此初始化之前,静态上下文无法访问该阶段。
我建议您尽早采用这种一致性,因为如果 Adobe 向 Stage 添加静态访问,它将更容易修复。只需将“Document.sstage”替换为 Adobe 提供的任何内容即可。
您可以使用访问器和修改器类来设置和检索舞台实例吗?