AS3.0 函数问题

作者&投稿:氐药 (若有异议请与网页底部的电邮联系)
AS3函数问题~

你是需要getParam返回什么值?

您好,您可以试着这么写看看。
var p1:MovieClip=new MovieClip();
var p2:MovieClip=new MovieClip();
drawC(p1);
drawC(p2);

function drawC(mc:MovieClip):void{
mc.graphics.beginFill(0xFF9900,1);
mc.graphics.drawCircle(0,0,15);
mc.graphics.endFill();
addChild(mc);

}

这代码确实没办法正常执行,你抄哪个书上的……
在这之前,希望你把自己的注解紧跟在每一句之后,用//来说明这是你的注解,否则代码我还能看懂,你的注解我完全理不出头绪。
1、var _sf:snowflake=new snowflake(); 这句创建雪花的代码从头到尾就只有一句,也就是说无论如何你的舞台上只可能有一个snowflake的变量,只可能有一个雪花而已,我并没有在ENTER_FTAME侦听函数看到创建雪花实例的代码。而在snow函数执行了1000次以后,也就是i大于1000了以后,这个可怜的雪花就会以帧频被移除(this.removeChildAt(1);),然后被添加 (stage.addChild(_sf); ),然后再被移除,再被添加……_sf.addEventListener(Event.ENTER_FRAME,snowfall);这句代码 已经没有任何意义了。

2、在snow函数里定义了speed和lf两个变量,因为是在函数内部定义的,所以这两个变量是局部变量,一旦离开了snow函数就不会存在了,所以在snowfall里调用了speed和lf,很遗憾,这里已经不是snow函数的“地盘”了,所以snowfall是无法找到speed和lf的,当然会告诉你这两个变量没定义。

3、ENTER_FRAME事件,Flash的API对它的说明是:播放头指向下一帧的时候调度该事件。但事实上是只要你的swf还在运行,ENTER_FRAME就会不停的被调度,比如你给stage侦听了ENTER_FRAME,之后在某个时间调用了stop()这个函数,主时间轴就停止了,不会在指向下一帧了,但ENTER_FRAME还是会勤恳的工作下去。所以,对ENTER_FRAME里的理解很简单:如果你的帧频是24,那么ENTER_FRAME侦听函数一秒会执行24次,如果你的帧频是60,那么ENTER_FRAME的侦听函数一秒会执行60次,仅此而已。所以,因为有了addEventListener(Event.ENTER_FRAME,snow); 这句代码,你的帧频是多少,snow函数一秒就会被执行多少次。

4、雪花下落的代码:
——————————————————————————————————————————
import flash.events.Event;
var _bging:bging=new bging();
stage.addChild(_bging);

addEventListener(Event.ENTER_FRAME,snow);
/*snow侦听函数,每一帧会执行一次,所以每一帧会生成一个雪花,个人认为如果帧频太高会造成恐怖的雪灾,虽然用一个变量可以控制,不过更好的方法是换成Timer事件。30帧一下应该还没问题*/

function snow(event:Event):void{
var sf:snowflake=new snowflake(); //因为每一帧会执行一次,所以每一帧生成一个雪花

sf.x=Math.random()*528; //雪花的横坐标,每个都是不一样的
sf.scaleX = sf.scaleY = Math.random()*.4; //雪花应该是大小不一的,取值范围是0到0,4?这个很不科学啊,虽然几率不大,不过可能会生成大小为0的雪花,看不见,所以毫无意义,因为不知道你元件的尺寸,所以我也不知道大小是多少适合,我总觉得这样的雪花过于小了。
sf.speedY = Math.random()*2+1; //重点!后面详细解释。speedY是雪花下落的速度,0到2的随机数,同理,有一定几率生成速度为0,根本不会下落的雪花,所以我擅自添加了“+1”。
sf.speedX = MaMath.random>0.5?Math.random()*2*(-1):Math.random()*2 //这句看起来比较装,其实就是雪花50%概率往左飘,50%概率往右飘,遵循了原代码的思路
stage.addChild(sf); //创建雪花之后将其显示在舞台上
sf.addEventListener(Event.ENTER_FRAME,snowfall); //给每一个雪花添加ENTER_FRAME事件。为什么呢?很简单啊, 想要雪花下落,无非就是不断改变雪花的y坐标,那么用了ENTER_FRAME侦听器,雪花的y坐标每一帧就会增加,也就形成了雪花下落的动画效果。
}

function snowfall(event:Event):void{
event.target.y += event.target.speedY; //雪花的y坐标每一帧都会加上speedY的值,形成下落的动画。不懂event.target是什么?就是当前事件的目标。是谁注册了这个侦听器呢?看前面的sf.addEventListener(Event.ENTER_FRAME,snowfall); ,注册侦听器的是sf,也就是雪花,那么event.target就指的当前注册侦听器的目标,也就是说event.target和sf是等效的。当然,这可不能换成sf,因为sf是snow函数里的变量,在这个函数里,sf是不存在的。这就是为什么要给每一个雪花(sf)注册一个侦听器,因为我只能用一个函数来控制所有的雪花,那么我用event.target就可以很轻松指向当前雪花来控制所有雪花了,而不用给每个雪花单独写一个侦听函数了。
event.target.x += event.target.speedX; //用来控制雪花水平方向运动的速度和方向。
}
——————————————————————————————————————————
其实就这么简单而已。现在解释一下sf.speedY = Math.random()*2+1; 这句重点。如你所想,每一个雪花下落的速度是不一样的,但是我们又不能在snow函数里定义speedY,因为在snowfall里是访问不到snow函数里的变量的,那么这句代码就是解决办法了。雪花元件是一个影片剪辑(MovieClip),他本身并没有speedY这个属性。但是影片剪辑是动态类,我们可以随时向他添加自己想要的属性。所以sf.speedY,Flash发现sf根本没有speedY这个属性,就会向他添加一个,并且把Math.random()*2+1的值赋给他,这样我们可以随时用sf这个属性了,比如你可以tarce(sf.speedY),这和sf其他属性,比如sf.x,sf.width都是一样的了。这样就可以给每个雪花一个单独的速度,并且在snowfall函数里调用这个属性来控制下落了。当然,后面用来控制水平方向运动的sf.speedX也是一个道理。

PS:无视那些大段的汉字注解,连同他们一起大胆的复制到Flash上吧,相信我,Flash会无视掉他们的,然后你就明白我一开始让你把注解写到//后面的意义了。

target是事件特有的属性,只有事件侦听函数才能用event.target。如果你把snowfall函数写在snow里面,不仅可以直接访问sf和sf的属性,也可以直接访问到snow里声明的变量,例如原代码中的speed和lf,完全可以实现相同的效果,也就是说,你的原代码把snowfall写在snow里就不会报“变量没定义”这样的错了,但是在面向对象的编程中,函数里再写函数的方法永远是不被推荐的。
偷偷告诉你~刚开始我做下雨下雪或者花瓣飘落的效果都是把snowfall写在snow里的,不过现在已经完全改掉这个习惯了。

再补充一点,snowfall函数里可以加一句
if(event.target.y > stage.height){ event.target.parent.removeChild(event.target);}
这样,雪花飘出舞台后就移除,雪花多的时候可以节约出来很多内存。

楼上的都说了这么多了,还没明白?一般情况下函数会有返回值的,就是在程序运行结束后返回指定的内容,如果不想让函数返回内容的话在AS3中可以在函数后面加上void关键字,这样函数就不返回数据,只执行内部语句,如果你想让函数返回一个整数,就把void换成int就行了


普定县17212036542: as 3.0问题
御卖谓宜: 大约是说你某个地方removeChild()使用得不对,参数非DisplayObjectMethodInfo-7() 应该是错误出现的位置···不过报错时提到的错误位置是运行时出现错误的位置,未必是代码出现错误的位置,比如你在函数a()里调用函数b(),b()中有代码错误,那么提示依然可能是a()中有错所以你应该把MethodInfo-7() 和其中调用的所有函数都检查一遍,尤其是每一个用到removeChild的地方

普定县17212036542: as3.0 函数调用问题 -
御卖谓宜: 这是一个对象生命周期的问题,在AS中,函数是一个域,凡是在函数内用var定义的变量,生命周期只限于此函数,随着此函数的生命周期的结束,此变量也随之结束,因此要想让你这个c函数内变量可以在b中使用,前提是你要定义一个时间轴...

普定县17212036542: flash as3.0函数问题 -
御卖谓宜: void表示无返回值

普定县17212036542: as3.0 函数传参问题 -
御卖谓宜: 可以在定义函数的时候,给参数默认值,应该定义a(B,A=值,c=值,d=值,e=值),使用的时候只需要传递一个就可以了,需要传递的放在最前面

普定县17212036542: 关于 Flash AS 3.0 中函数的定义问题 -
御卖谓宜: 问题一:e:event,e:"事件的类",目的为了更方便读懂代码,如不想填写可用一字母简略,但不可为空(至少在CS4中不行).问题二:e.target.x,事件目标.x;如:yp_mc.addEventListener(Event.ENTER_FRAME,enterFrame) function enterFrame(e:event):viod{ e.target.y=Math.random()*10-2 };//e.target指yp_mc.Math.random()*10-2//随机取一10到2间的数字

普定县17212036542: AS3.0 代码 传递函数参数问题 -
御卖谓宜: 你可以aaa = aa("a11");因为你用数字时是被认作为数值,而你用字母时会被认作某个对象,而你这个对象又确实没有定义,如果要传递字符串值就必须"a11",这样就不是对象了.你这个代码里传递参数本就是蛋疼的一件事,没用!我看你bbb=函数(参数)传递的参数没有起到作用啊?你干嘛要传参数?直接写成:var bbb:MovieClip;bbb = bb();function bb():MovieClip { var a22:a2 = new a2(); addChild(a22); return a22;}

普定县17212036542: as3.0中函数的相关问题 -
御卖谓宜: 这代码确实没办法正常执行,你抄哪个书上的……在这之前,希望你把自己的注解紧跟在每一句之后,用//来说明这是你的注解,否则代码我还能看懂,你的注解我完全理不出头绪.1、var _sf:snowflake=new snowflake(); 这句创建雪花的代...

普定县17212036542: flash as3.0函数内部声明变量问题 -
御卖谓宜: 你这里的a直接赋值,外部是调用不了的,只能作用于函数内部,这叫局部变量.生命周期随着函数的终结,也自然终结了.这个a值外部调用不了,也就是说,你不可能在函数的外部获取这个a的值.其实你这个a在函数内定义了,这句var 就是定义的意思.

普定县17212036542: AS3.0错误问题 -
御卖谓宜: 出现这个错误提示 是因为你使用了 一些系统保留的函数名称 把onMouseDown 名字改了试试 add了一个监听,当MOUSE_DOWN的时候调用函数 onMouseDown 这个函数.然而 因为 onMouseDown这个函数名称是 系统保留的函数名称.所以会出现迁移问题.

普定县17212036542: AS3.0 函数参数传递问题 -
御卖谓宜: btn.addEventListener(MouseEvent.CLICK,function(e){creat_sm(e,"index")});function creat_sm(e,b):void{ trace("b = "+b);}可以直接复制,按钮命名为“btn”,Ctrl+Enter测试注意了function creat_sm(e,b):void{中参数e是楼上各位说到的那个参数

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网