永发信息网

as3.0中函数的相关问题

答案:2  悬赏:40  手机版
解决时间 2021-04-07 04:52
as3.0中函数的相关问题
最佳答案
这代码确实没办法正常执行,你抄哪个书上的……
在这之前,希望你把自己的注解紧跟在每一句之后,用//来说明这是你的注解,否则代码我还能看懂,你的注解我完全理不出头绪。
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);


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);}
这样,雪花飘出舞台后就移除,雪花多的时候可以节约出来很多内存。
全部回答
你觉得要是不理解event_frame这个的话,可以使用timer,event_frame就是帧事件,所有flash动画都是帧控制的,没有帧flash就没有意义了,这个事件就是每一帧都会调用snow
函数追问大神啊!再看一下后面吧,这个代码是我原封不动抄的书上的,但是却没法运行,就是说最后函数中的变量没有定义,应该怎么处理?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
当今第一球星卡卡在实况足球的数据怎么老样子
黑发好还是染发
有现代的小说,女主漂亮,有好多人喜欢她,校
纪检组长有权力吗
1962年,美国女生物学家莱切尔·卡逊在什么书
今天下午和同学玩的时候不小心头撞到了墙,起
不想和老乡在一个公司上班怎么办
jQuery 32发布,滴滴采用Vue 20重构Web App,
大家谁知道大理古城88号甜品店老板德国老太叫
有新品游戏主机吗?推荐个,好不好?
梦见领导打了我两巴掌,我跟她吵架了
男人会记得第一个女人第一个流产的女人么
求一副尾句带天公或大公,包公的对联
求建筑工地大门对联,要求以广和厦二字开头的
动车上的女乘务员个个都又高又膀,还大屁股,
推荐资讯
为什么不能运行spss 中岭回归分析
怎么样去广西支教?
DNF加14的寒光剑值多少钱?
什么软件可以编辑1080P高清视频?
我在微信里给别人发了个红包?可是一查我的钱
结婚脸盆洗漱东西男方买了 女方嫁的时候拿什
挪威的森林歌词
高考有没有均衡生??????像中考一样可以
查询e服务手机号异常请稍后再试
里面有薇,有飞的爱情诗
酩酊大醉反义词
天在下雨,我在想你,远方的你不知是否有感应
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?