Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
flash as3-文档类外的访问阶段_Flash_Actionscript 3 - Fatal编程技术网

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

flash as3-文档类外的访问阶段,flash,actionscript-3,Flash,Actionscript 3,我正在尝试向stage添加一个键盘事件侦听器,以检测用户何时单击左箭头键或右箭头键。但是这个监听器是从导入到文档类的类文件中调用的,因此我认为它不知道“stage”指的是什么。我如何解决这个问题 这是我的代码: 文档类:AugmentedReality.as: package { import examples.PlaneVid_Carousel; public function AugmentedReality(){ addChild (new PlaneVid_Carous

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

这是我的代码:

文档类:AugmentedReality.as:

package {
  import examples.PlaneVid_Carousel;

  public function AugmentedReality(){
    addChild (new PlaneVid_Carousel())
  }
}
平面视频传送带{

  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
      }

    }

  }
}

将PlaneVid_旋转木马添加到舞台后,添加键盘侦听器,舞台将可访问

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
}

我总是对我的DisplayObjects使用此init方法,它是FlashDevelop的DisplayObject的默认模板。

简单的解决方法是在document类上添加一个静态属性,在本例中称为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);
现在它不必是document类的属性,也许像
StageProxy
这样的专用类更清晰,您仍然可以从document类分配它

public function MyApp() {
    StageProxy.stage = stage;
}
并从任何地方访问它:

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

这仍然不是我所说的“干净”或“漂亮”,但它完成了任务。

@mheavens,忘了我说的话。我完全忽略了你们班实际上是一个精灵的事实。@adam说的是这样做的适当方式。