as3.0中函数的相关问题
答案:2 悬赏:40 手机版
解决时间 2021-04-07 04:52
- 提问者网友:孤凫
- 2021-04-06 20:12
as3.0中函数的相关问题
最佳答案
- 五星知识达人网友:独行浪子会拥风
- 2021-04-06 20:37
这代码确实没办法正常执行,你抄哪个书上的……
在这之前,希望你把自己的注解紧跟在每一句之后,用//来说明这是你的注解,否则代码我还能看懂,你的注解我完全理不出头绪。
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);}
这样,雪花飘出舞台后就移除,雪花多的时候可以节约出来很多内存。
在这之前,希望你把自己的注解紧跟在每一句之后,用//来说明这是你的注解,否则代码我还能看懂,你的注解我完全理不出头绪。
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);}
这样,雪花飘出舞台后就移除,雪花多的时候可以节约出来很多内存。
全部回答
- 1楼网友:玩世
- 2021-04-06 21:35
你觉得要是不理解event_frame这个的话,可以使用timer,event_frame就是帧事件,所有flash动画都是帧控制的,没有帧flash就没有意义了,这个事件就是每一帧都会调用snow
函数追问大神啊!再看一下后面吧,这个代码是我原封不动抄的书上的,但是却没法运行,就是说最后函数中的变量没有定义,应该怎么处理?
函数追问大神啊!再看一下后面吧,这个代码是我原封不动抄的书上的,但是却没法运行,就是说最后函数中的变量没有定义,应该怎么处理?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯