如何在Adobe Flash中从AS3类访问舞台

5
我遇到的问题是,我使用keyboardEventListener让movieclip在舞台上移动。由于我是一名大学生,正在为一项任务创作这个程序,但我们必须使用as3类。
当我在主时间轴(maintimeline)中运行代码时,没有问题。但是当我尝试从另一个类中访问它(在涉及的movieclip上使用“Export for ActionScript”),我会收到一个错误,他无法访问舞台。 this.stage.addEventListener(KeyboardEvent.KEY_DOWN, dostuff);
4个回答

9

在AS3中,类只有在实际放置在舞台上时才存在。因此,“this.stage”在编译时将为null。您可以通过使用ADDED_TO_STAGE事件来解决此问题,以延迟绑定侦听器直到合适的时间。

public function MyClass(){
    this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}

private function addedToStageHandler(e:Event):void{
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, dostuff);
}

好的!我解决了舞台问题。不过还是遇到了一些错误。我收到了找不到键盘的错误,并且每个错误都出现在以下代码上: "if (evt.keyCode == Keyboard.RIGHT){ //stuff }"错误如下: "1120:访问未定义的属性Keyboard。"非常感谢您解决舞台问题!我已经在Google上搜索了很久,但没有找到任何相关的信息! - Graphithy
@Graphithy 如果你有其他问题,请在stackoverflow上提出新的问题,而不是在评论中提问。 - davr

0

当你创建类时,必须从类内部引用舞台,因为它不可全局访问,你必须将其传递到类中。下面是一个在类内使用舞台事件监听器的示例。

package  {
    import flash.events.KeyboardEvent;

    public class Eventhndl{

        private var obj:Object; //create local variable to refarance stage


        public function Eventhndl(objStage:Object):void{
            obj = objStage; //make local refarance for stage inside the class

            obj.addEventListener(KeyboardEvent.KEY_DOWN,runit); //add the event listener
        }

        private function runit(Event:KeyboardEvent):void{
            trace("keyDownHandler: " + Event.keyCode);
            trace("ctrlKey: " + Event.ctrlKey);
            trace("keyLocation: " + Event.keyLocation);
            trace("shiftKey: " + Event.shiftKey);
            trace("altKey: " + Event.altKey);
        }
    }

}

将文件保存为Eventhndl.as,现在您只需添加此类的实例并传递需要监听其事件的任何对象,以下是如何操作。

import Eventhndl;

var EH:Eventhndl = new Eventhndl(stage); 

0
"1120:访问未定义的 Keyboard 属性。这就是答案。你还没有定义键盘属性,这意味着你还没有将其导入到包中。

应该看起来像这样:

"
 import flash.display.*;
 import flash.events.*;
 import flash.ui.*; 

建议:深入研究导入。尝试使用Flash Builder,对于初学者来说更好,并且自动导入类,因此您不需要记住所有内容。

0

这个答案帮了我无数次,但我还没有足够的积分来顶它一下,否则我就会这么做。

当你尝试在舞台上添加任何东西之前访问它时,通常会发生这种情况。我曾经在所有项目主类的构造函数中使用init(),但由于这个问题,我不再这样做了。现在,我用以下代码替换它(其中Main是类的构造函数/名称):

public function Main():void {
    this.addEventListener(Event.ADDED_TO_STAGE, init);
    super();    
}
...
private function init(e:Event):void {
...

希望这能帮助到其他读过我所读的任何关于Flash的书籍,提供了init()思路的人。
还有...谢谢Greg W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接