我正在尝试向舞台添加键盘事件侦听器,以检测用户何时单击左箭头键或右箭头键。但是这个监听器是从一个导入文档类的类文件中调用的,因此我认为它不知道“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
}
}
}
}
答案 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);
这仍然不是我所谓的'干净'或'漂亮',但它完成了工作。