flash as3 - 文档类外的访问阶段

时间:2011-06-23 21:25:05

标签: flash actionscript-3

我正在尝试向舞台添加键盘事件侦听器,以检测用户何时单击左箭头键或右箭头键。但是这个监听器是从一个导入文档类的类文件中调用的,因此我认为它不知道“stage”指的是什么。我该如何解决这个问题?

这是我的代码:

文档类:AugmentedReality.as:

package {
  import examples.PlaneVid_Carousel;

  public function AugmentedReality(){
    addChild (new PlaneVid_Carousel())
  }
}

PlaneVid_Carousel.as {

  package examples {
    import flash.display.*;
    import flash.events.*;

    public class PlaneVid_Carousel extends Sprite {

      public function PlaneVid_Carousel(){
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown
      }

      protected function keyPressedDown(e:KeyboardEvent):void {
        //DO STUFF
      }

    }

  }
}

2 个答案:

答案 0 :(得分:2)

在将PlaneVid_Carousel添加到舞台后添加键盘侦听器,然后可以访问舞台。

public function PlaneVid_Carousel() 
{
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
}

protected function keyPressedDown(e:KeyboardEvent):void 
{
    //DO STUFF
}

我总是将这个init方法用于我的DisplayObjects,它是FlashDevelop的DisplayObject的默认模板。

答案 1 :(得分:0)

简单的解决方法是在文档类上添加一个静态属性,对于此示例,该属性称为MyApp.as。通过在一个合适的时间点设置一个值来为globalStage属性赋值,对于文档类中的大多数情况,它可以是构造函数:

public class MyApp extends Sprite {
    public static var globalStage:Stage;
    //...

    public function MyApp() {
        globalStage = stage;
    }
}

之后,您可以通过导入文档类并调用此代码段从任何地方访问该阶段:

MyApp.globalStage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);

现在它不必是文档类的属性,也许像StageProxy这样的专用类会更清晰,你仍然可以从文档类中分配它。

public function MyApp() {
    StageProxy.stage = stage;
}

从任何地方访问它:

StageProxy.stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);

这仍然不是我所谓的'干净'或'漂亮',但它完成了工作。