flash cs3 AS3:TypeError: Error #1009: 无法访问空对象引用的属性或方法。

TypeError:Error#1009:无法访问空对象引用的属性或方法。atMouseDistance/::init()atMouseDistance$iinit()a... TypeError: Error #1009: 无法访问空对象引用的属性或方法。
at MouseDistance/::init()
at MouseDistance$iinit()
at AA_fla::MainTimeline/AA_fla::frame1()

源代码:
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
/*测量场景中心与鼠标的距离*/
public class MouseDistance extends MovieClip {
private var mc1:MovieClip;
private var Tex:TextField;
private var Fma:TextFormat;
public function MouseDistance() {
init();
}
private function init():void {
mc1=new MovieClip();
addChild(mc1);
mc1.graphics.beginFill(0x000000);
mc1.graphics.drawRect(-2,-2,4,4);
mc1.graphics.endFill();
mc1.x=stage.stageWidth/2;
mc1.y=stage.stageHeight/2;

Fma=new TextFormat();
Fma.color=0xff0000;
Fma.size=20;
Tex=new TextField();
addChild(Tex);
Tex.border=true;
Tex.borderColor=0;
Tex.defaultTextFormat=Fma;
Tex.x=180;
Tex.y=120;
Tex.height=30;
Tex.width=80;

stage.addEventListener(MouseEvent.MOUSE_MOVE,onMM);
}
public function onMM(event:MouseEvent):void {
graphics.clear();
graphics.lineStyle(2,0x9900FF,1);
graphics.moveTo(mc1.x,mc1.y);
graphics.lineTo(mouseX,mouseY);
var dx:Number=mc1.x-mouseX;
var dy:Number=mc1.y-mouseY;
var d:Number=Math.sqrt(dx*dx+dy*dy);
var dist:Number =Math.round(d*Math.pow(10,2))/Math.pow(10,2);
Tex.text=dist.toString();

}
}
}
可是在fla中
var f:MouseDistance=new MouseDistance();
addChild(f);
总是出现上面的问题
展开
 我来答
百度网友e246de7
2012-05-08 · TA获得超过144个赞
知道小有建树答主
回答量:88
采纳率:80%
帮助的人:140万
展开全部
先总的说一句,此报错是因为你在“对象还没加载到舞台上”的时候,就让这个对象“访问了舞台”,因为它找不到舞台,于是报错。

下面详细的解释一下:
你新建了一个MouseDistance类对象f,它的构造函数运行init();并且这个函数里面用到了舞台(语句:mc1.x=stage.stageWidth/2;),但是这个时候你还没有将f放入舞台(语句:addChild(f);),所以它找不到stage,然后报错。当你用mc1.x=150;mc1.y=125这样的语句写死的时候,就不会报错了。

但是你肯定也发现上面的解决方法相当的傻,下面说一个聪明的:
先侦听这个对象是否被加载到舞台上,当它被加载到舞台上的时候,你再执行你的init(),如此你就可以再init()里随意的访问stage了。具体代码如下:

package {
......
import flash.events.Event;//导入Event类
public function MouseDistance() {
addEventListener(Event.ADDED_TO_STAGE, init);//加“加载到舞台”的侦听
}
private function init(e:Event):void {//加个参数
......
}

你的代码是实时显示鼠标到舞台中心点的距离,并且将“中心点”和“鼠标所在点”连线,我这里如上更改后运行正常,希望我的解释对你有帮助。
zb6306
2012-05-04 · TA获得超过777个赞
知道大有可为答主
回答量:2585
采纳率:66%
帮助的人:1148万
展开全部
修改一下脚本:
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.display.Stage;
/*测量场景中心与鼠标的距离*/
public class MouseDistance extends MovieClip {
         private var sta:Stage;
private var mc1:MovieClip;
private var Tex:TextField;
private var Fma:TextFormat;
public function MouseDistance(obj:Stage) {
sta=obj;
init();
}
private function init():void {
mc1=new MovieClip();
addChild(mc1);
mc1.graphics.beginFill(0x000000);
mc1.graphics.drawRect(-2,-2,4,4);
mc1.graphics.endFill();
mc1.x=stage.stageWidth/2;
mc1.y=stage.stageHeight/2;

Fma=new TextFormat();
Fma.color=0xff0000;
Fma.size=20;
Tex=new TextField();
addChild(Tex);
Tex.border=true;
Tex.borderColor=0;
Tex.defaultTextFormat=Fma;
Tex.x=180;
Tex.y=120;
Tex.height=30;
Tex.width=80;

stage.addEventListener(MouseEvent.MOUSE_MOVE,onMM);
}
public function onMM(event:MouseEvent):void {
graphics.clear();
graphics.lineStyle(2,0x9900FF,1);
graphics.moveTo(mc1.x,mc1.y);
graphics.lineTo(mouseX,mouseY);
var dx:Number=mc1.x-mouseX;
var dy:Number=mc1.y-mouseY;
var d:Number=Math.sqrt(dx*dx+dy*dy);
var dist:Number =Math.round(d*Math.pow(10,2))/Math.pow(10,2);
Tex.text=dist.toString();

}
}
}
追问
为什么看不到效果,什么都没有啊
追答
我解决的是你报错的问题,现在不报错就可以了,至于为什么不显示,这要看你的脚本是咋写的,这个类是干什么用的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
FlashASer

2012-05-04 · Animate,Photoshop,职场经验,人生感悟!
FlashASer
采纳数:14298 获赞数:18654

向TA提问 私信TA
展开全部
解决方法,在舞台的属性面板中把文档类改成:MouseDistance
这样就不用在用var f:MouseDistance=new MouseDistance();
可以看到你想要的效果。
问题:stage只能是舞台层级可用的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式