关于AS2和AS3的onEnterFrame和onClipEvent(enterFrame)的异同

来源:互联网 发布:百度飓风算法 编辑:程序博客网 时间:2024/06/08 06:52

关于AS2和AS3的onEnterFrame和onClipEvent(enterFrame)的异同

在flashAS手册里,关于EnterFrame的解释是:进入帧。
_mc.onEnterFrame{}就是表示当影片播放到当前帧,触发一个事件。

刚开始学AS的时候,我顺其自然地认为,如果当前帧用了stop语句,那么影片就会停止播放,就不会再触发onEnterFrame事件了。但是有意思的是,实际上,EnterFrame的最多的用处是和stop配合来使用的。

在别的编程语言里,等待某个变量改变,一般用循环语句来等待。这些循环语句一般是if...else、do...loop、for ... next等等。这些在AS里也有,但是你自己试试看,一旦使用这些循环,一旦循环次数较多,很容易使影片停顿,甚至进入死循环。

在AS里,一般不用循环语句来监测变量。而是用EnterFrame和stop配合来实现的。

AS的帮助文章没有任何声明:当影片stop在当前帧的时候,并没有真正停止播放,而是反复播放当前帧。而且,是按照影片设定的帧频率反复播放,反复触发EnterFrame事件。

我为此疑惑很久。

但是,AS很多例子都利用这个模式来进行循环:

stop();

_mc.onEnterFrame=function{

    程序处理语句

};

了解这个道理,我们可以通过设定影片播放的帧频率来控制循环速度。比如说需要很慢的时候,甚至每秒钟循环一次也可以的。


下面说说onEnterFrame和onClipEvent(enterFrame)在使用上的不同。因为很多初学的都会有些疑惑的。


   onEnterFrame   onClipEvent(enterFrame)
 
使用的地方 写在帧脚本编辑框里 写在MovieClip(影片剪辑)的脚本编辑框里
 
格式  _mc.onEenterFrame=function(){}  OnClipEvent(enterFrame){}
 
类型  事件处理函数  事件
 
执行的先后循序 后   前
 

关于“执行的先后循序”是我自己的一个试验得出的结论。

我在一帧里,在帧的脚本里有:


_mc.onEenterFrame=function(){

   trace(“onEenterFrame”)

}


然后在_mc的脚本里再写:


onClipEvent(enterFrame) {

   trace(“onClipEvent(enterFrame)”)

}


当时我的变态的心理是看看onEnterFrame和onClipEvent(enterFrame),到底哪个更厉害,结果出什么?

结果是:

onClipEvent(enterFrame)

onEnterFrame

onClipEvent(enterFrame)

onEnterFrame

onClipEvent(enterFrame)

onEnterFrame

onClipEvent(enterFrame)

onEnterFrame

--------------------------------------------------------------------------------------------------------------------------------

onEnterFrame函数在AS2时代可谓威风八面,没有谁对这个事件不熟悉的。到了AS3到底怎么用呢?我认真学习了下。
addEventListener 函数为某事件指定一个侦听器。输入要侦听的事件名称以及要执行处理的函数名称。看一个例子:
addEventListener("enterFrame", onEnterFrame);
在加入事件侦听器时,可使用可选参数,这儿的事件名"enterFrame"为字符串型,有人戏称它为“魔力字符串”(Magic String)。为什么这么叫?如果你误输入成了"entorFrame",尽管没有这个事件名称,编译器也会编译执行它,但会发现事件处理函数没有执行。除了使用“魔力字符串”以外,还可以使用事件类(Event Class)的属性。例如:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
实际上 Event.ENTER_FRAME 的值就是”enterFrame”这个字符串。所以推荐这样使用。
另外,这儿的事件处理函数是onEnterFrame,在 AS 3 中,可以任意地命名,比如这样写都行的:
addEventListener(Event.ENTER_FRAME, 下点小雪吧);

但是因为我们在AS2中已经习惯使用这个名称,所以还是用这个吧。谁都一看就懂了。如果要停止这个事件侦听,就用 removeEventListener 方法解除该成员;就是告诉对象从侦听器列表中删除该侦听器,这样一来,他就不会再接收信息了。
痒了,快来试试吧:
步骤:
1、在库中创建一个雪花飘落的影片剪辑,在元件属性中选择为 ActionScript 导出。在以前的 Flash 版本中,可以自由地给出标识符或输入一个类名。而在 Flash CS3 中,标识符一栏不可用了,类一栏会自动地填入默认值。这里还多出了基类一栏,默认为flash.display.MovieClip,这里也可以填入继承自 MovieClip 或 Sprite 的自定义类。随意输入一个类名叫“xiaxue”,不必担心没有这个类,然后点击确定。这个地方很有趣,Flash 找不到这个类,它就会自动生成一个类,并对其进行编译。并不是说 Flash 会创建一个ActionScript 类文件,但它会在 SWF 中,生成一串字节代码表示一个继承自 Sprite 或MovieClip 的类。除了继承了基类,它什么都不会做,但它已经与库中的元件连接上了。这点是从康老那儿学来的,学以致用嘛。
2、创建文件类,叫帧频事件.as。写入代码:

package {
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
    public class 帧频事件 extends Sprite {
        var i:Number = 1;
        public function 帧频事件() {
            下雪();
        }
        private function 下雪():void {
            addEventListener(Event.ENTER_FRAME,下小雪吧);
        }
        function 下小雪吧(event:Event):void {
            var 雪花:xiaxue= new xiaxue();
            addChild(雪花);

            雪花.x = Math.random()*550;
            雪花.scaleX = 0.2 + Math.random();
            雪花.scaleY = 0.2 + Math.random();
            i++;
            if (i>100) {
                this.removeChildAt(1);
                i=100;
            }
        }
    }
}
开始下雪了吧?OK

几点体会
1.康老讲过的讲过生成 Sprite 或 MovieClip 类的子类,对某个类进行子类化是非常有用的。它代替了 AS 2中attachMovieClip 功能,我们想从库中取出影片剪辑元件放入舞台的方法就是使用一个继承自 MovieClip 或 Sprite 的类。它除了继承了基类,它什么都不会做,但它已经与库中的元件连接上了。然后写:

var 雪花:xiaxue= new xiaxue();
addChild(雪花);
 
  这样就在舞台上创建了一个库中的元件,就像 AS 2 的 attachMovie 方法一样。我们要是能给出自定义的真正的类名及路径的话,那么就可以让元件附加很多功能。

当然仅此还不够,在AS3中attachMovie已经消失了,AS3中,用 new 来创建任何可视元素,在需要用的时候把它加到舞台上,不用的时候移除下来,等到再用的时候,还可以再放上去就是。
放的这个语句就是:addChild(雪花);
//字面意思是把孩子通过文档类加到舞台上,呵呵,原先他在后台休息啊,因此非常方便。由于这个特点,不同swf 里面的元件可以相互使用了,比如你在 swf1 的库里面做了一个图标,绑定的类是“类1”,你可以把 swf1 加载到 swf2 中,然后通过 new 类1()创建一个那个图标,然后通过 addChild()方法把它加到 swf2 的舞台上。这样就不需要使用共享库功能了。
专业地这个叫“显示列表”,AS 2 中,显示列表的用法是:
用 attach 或 createEmptyMovieClip 方法创建影片剪辑,必须指定它位于树的哪个位置。这样一来,影片剪辑要放置在列表的指定位置。当删除该影片时,同样也无法改变它在列表中的位置或在列表中移除它。
在 AS 3 中,创建了一些 Sprite 影片后,不会自动被加入显示列表。也不涉及父级影片或深度的问题,这样就可以在它没有加入视觉列表之前就对其进行操作了。
当然使用 removeChild 方法,从显示列表中删除一个对象,并以该对象的名字作为参数。不是去毁灭它,对象依然保持原样,只是暂时被移除到“后台”,当再次被加入到显示列表中,对象仍保持原来的状态。
2、duplicateMovieClip() 已删除。 在 ActionScript 3.0 中,使用 new 运算符来创建新的实例。这个再不罗嗦了.

 

原创粉丝点击