2010-01-28 41 views
2

如何在不是我的主类而不是displayobject的类中访问Actionscript 3中的舞台?如何访问不是DisplayObject的类中的舞台?

+0

为什么不把它传递给构造函数? – 2011-04-06 04:21:11

+1

因为将它传递给构造函数是屁股疼痛。静态类不会有构造函数,添加一个静态的“init”方法会破坏静态类的目的,因为你必须记住在任何可能使用这样的类的项目中初始化它。这个阶段总是存在,并且它是一个史诗般的失败,它不能从AS3的静态上下文中访问,也没有在某些任意静态变量中手动存储。 – Triynko 2012-11-20 18:27:45

回答

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; 
} 
} 

,并在其他类进口类持有该静止无功,当然变种已在访问之前被初始化它。

import MyMain; 

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

真正的问题是缺乏从静态上下文访问舞台的一致方法。编译成可重用SWC项目的数百个静态类可能希望从静态上下文访问该阶段,避免在每个类上调用某个“init”方法的唯一方法是指定一个特定的静态变量,它们都可以一致地访问。这将创建一个单一的初始化点,但它仍然会涉及记住从文档类中调用该“init”方法。这是Adobe通过不提供静态阶段访问而让所有人都处于状态的位置。 – Triynko 2012-11-20 18:43:27

0

你可以使用accessor和mutator类来设置和检索舞台实例吗?

1

Adob​​e未能提供对舞台的静态访问权限,使您无法选择,只能自行实施。

这是一个史诗般的失败,因为在您的主文档类实例构造函数运行以隐藏某个任意静态变量中的舞台实例之前,无法访问舞台。

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

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

鉴于所有这些......最合乎逻辑的步骤是: 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.sstage”具有对舞台的静态访问权限。在主文档类中发生此初始化之前,没有办法让静态上下文访问该阶段。

我建议你很早就采用这种一致性,因为如果Adobe增加了对Stage的静态访问,它将更容易修复。这只不过是用Adobe提供的任何东西来代替“Document.sstage”。