打印

[AS3] 为什么这个类不能加入键盘侦听???(有源码)

运行出现错误,百思不解,望高手指点!
错误信息:
TypeError: Error #1009: 无法访问空对象引用的属性或方法。
        at mytest$iinit()
        at _fla::MainTimeline/_fla::frame1()
程序:
有xxx.fla和mytest.as,
mytest.as和xxx.fla里的库里的一个MovieClip(简称mc)相关联,
想实现程序实例化mc,并用这个实例化的mc自己可以侦听键盘,代码如下:
mytest.as中的代码:
package{
        import flash.display.*;
        import flash.events.*;
        public class mytest extends MovieClip{
                function mytest(){
                        trace("我被创建了");
                        //就是下面这句,有什么错啊??
                        this.stage.addEventListener(KeyboardEvent.KEY_DOWN,myfun);
                }
                function myfun(){
                        trace("按了键盘");
                }
        }
}
xxx.fla中的代码:
var a:mytest=new mytest();
a.x=50;
a.y=50;
addChild(a);
自己在构造函数里面trace(this.stage);看看
mytest在被添加到stage中之前哪来的stage对象?

多谢神

我想是不是这个原因:在构造函数里不能用this.stage,因为程序实例化的顺序是这样,1先在内存开辟一个区域存放对象,2赋予各种在类里面定义的属性,3运行构造函数,4关联到舞台.
正因为运行构造函数时还没有关联到舞台所以this.stage是空的.不知这样理解正确不?

改进方法目前想到两个:1,构造函数设个参数,传递舞台stage引用  2,把this.stage移出构造函数,放到类的另外函数中,在xxx.fla的时间轴程序中调用。  不知正解应该怎样做?望赐教
可以在添加到舞台的事件中来处理

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
引用:
原帖由 sdw0813 于 2008-6-11 08:30 发表
我想是不是这个原因:在构造函数里不能用this.stage,因为程序实例化的顺序是这样,1先在内存开辟一个区域存放对象,2赋予各种在类里面定义的属性,3运行构造函数,4关联到舞台.
正因为运行构造函数时还没有关联到舞台所 ...
两种方法都都可以
用楼上说的在MC被添加到舞台时的时间处理函数里引用this.stage也行

TOP

引用:
用楼上说的在MC被添加到舞台时的时间处理函数里引用this.stage也行
这个具体是用什么代码呢?怎样实现
是不是在MC的类里面加入:this.addEventListener(flash.events.Event.ADDED_TO_STAGE,myfun);
然后在myfun里面引用this.stage

TOP

package
{
       import flash.display.*;
       import flash.events.*;
       public class mytest extends MovieClip
       {
              function mytest(stag:*)
              {
                     trace("我被创建了");
                     stag.addEventListener(KeyboardEvent.KEY_DOWN,myfun);
              }
              function myfun(e:KeyboardEvent)
              {
                     trace("按了键盘");
              }
       }
}


var a:mytest=new mytest(stage);
a.x=50;
a.y=50;
addChild(a);

TOP

引用:
原帖由 sdw0813 于 2008-6-11 11:46 发表
是不是在MC的类里面加入:this.addEventListener(flash.events.Event.ADDED_TO_STAGE,myfun);
然后在myfun里面引用this.stage
正解

TOP