代码之家  ›  专栏  ›  技术社区  ›  Chris

如何访问不是DisplayObject的类中的阶段?

  •  2
  • Chris  · 技术社区  · 16 年前

    如何访问不是我的主类而不是DisplayObject的类中ActionScript 3中的阶段?

    4 回复  |  直到 13 年前
        1
  •  2
  •   Josh    16 年前

    最简单的方法是使用全局对象

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

    本页提供了如何从任何类中设置和检索对象的示例。

        2
  •  3
  •   Patrick    16 年前

    简单的方法,你可以把它放在 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...
     }
    }
    
        3
  •  1
  •   Triynko    13 年前

    Adobe未能提供对该阶段的静态访问,您只能自己实现它。

    这是一个史诗般的失败,因为在主文档类实例构造函数运行以将阶段实例存储在某个任意静态变量中之前,不可能访问阶段。

    由于每次需要静态访问阶段时都必须初始化该任意静态变量,因此最好确保只需执行一次。

    为了确保只需要初始化一次,必须确保编写的每个静态方法都指向该变量,并且在初始化变量之前不尝试访问它。

    尽管如此…最合理的步骤是: 1。立即向Adobe提交功能请求。 2.第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 );           
            }
        }
    }
    

    只要所有的文档类扩展上面定义的“文档”类(并立即在其构造函数中调用“super”),就不必多次编写此类。通过这样做,您的文档的构造器代码和项目的其余部分将通过“document.s stage”静态访问阶段。在主文档类中发生此初始化之前,静态上下文无法访问阶段。

    我建议您在早期就采用这种一致性,因为如果Adobe曾经向Stage添加静态访问,它将使修复变得更容易。这只是用Adobe提供的任何内容替换“document.sstage”的问题。

        4
  •  0
  •   alvincrespo    16 年前

    您可以使用accessor和mutator类来设置和检索阶段实例?