2.4影片剪辑事件 相对于前面所介绍的鼠标事件、键盘事件以及帧事件而言,影片剪辑事件则显得稍为有点难懂。当我们将一个影片剪辑放到场景中时,他就成了一个“事件发射器”,不断地报告自己的运行状态,如果我们捕获这样的事件,就可以做出相应的反应和处理。影片剪辑有多种,下面分门别类地加以介绍。 2.4.1onClipEvent(Load)和onClipEvent(unload) 这个事件在影片剪辑加载的时候发生,那什么是影片剪辑的加载呢?比方说,你在场景中添加了一个影片剪辑clip_mc,并让他在第10帧的时候出现影片中,那么第10帧的时候它就会触发这个事件。要想处理这个事件可以选择影片剪辑clip_mc,然后在下面的脚本面板中输入这样的代码(通常用来对影片剪辑进行初始化): onClipEvent(Load) { } onClipEvent(unload)的作用和onClipEvent(load)的作用恰好相反,当影片剪辑消失的时候,这个事件就会发生。 2.4.2OnClipEvent(enterFrame) enterFrame事件会随着影片的播放而不断发生,影片每前进一帧,影片剪辑就会触发一次enterFrame事件。假设影片的播放速率为每秒20帧,那么这个事件就会以每秒20次的速率不断产生。你一定会问,这样的事件有什么作用?其实在影片剪辑事件中,enterFrame应该说是最常用的,因为他可以用来制作相当复杂的动画。比方说,我们要制作一个炸弹从空中不断翻滚落下的动画可以按照这样的步骤来执行:首先建立一个影片剪辑作为炸弹,将其拖放到场景中建立影片剪辑实例,让这个实例捕捉enterFrame事件,并为其设计这样的代码: onClipEvent(enterFrame) { this._Roation+=10; this._y+=10; } 这段代码的意思就是,每隔一帧将影片剪辑(this)旋转10度,同时沿纵向移动10个单位。这里用到了一个“+=”运算符,可能有点容易让人感到困惑,其实这是一种常用的运算符简写方式,意思是“自己给自己加上某个值”,例如This._Rotation+=10和This._Rotation=This._Rotation+10是等效的。 2.4.3onClipEvent(MounseMove)、onClipEvent (mouseDown)和onClipEvent (mouseUp) 这个事件和前面见过的很多时间似乎有些相似,这几个事件确实是当鼠标移动的时候发生,但是要特别注意一点,不论鼠标在场景的什么位置(而不一定要在影片剪辑上方),这个事件都会发生。鼠标每动一下,MouseMove事件都会发生一次。同样,你又要问,这个事件能干什么了?举例来说,我们需要制作一个类似泡泡龙那样的游戏,屏幕下方有一门大炮,当鼠标移动的时候,炮口会始终指向鼠标的方向。这种效果就可以onClipEvent(MouseMove)来实现。具体来说,就是将大炮制作成一个影片剪辑,然后为其添加这样的代码: onClipEvent(mouseMove) { var_angle=((this._x-_root._xmouse)/(this._y-_root._ymouse)); trace(var_angle); var_angle=Math.atan(var_angle); var_angle=var_angle*180/Math.PI; this._Rotation=-var_angle; } 这段代码用到了几个Flash提供的数学函数,它们都是在Math对象内部的,因此用起来很方面。首先,用当前影片剪辑的横向和纵向座标减去鼠标的横向和纵向座标,然后计算及其夹角的正弦值,接着将这个值用反正切函数换算成角度(Math.atan),注意,结果是弧度数,需要再转换成常用的角度,最后在将其复制给影片剪辑的_Rotation参数,实现大炮随着鼠标指针的运动而旋转的效果。 搞懂了mouseMove事件,MouseDown和MouseUp的含义也就不难理解了。 2.4.4OnClipEvent(keyDown)和onClipEvent(KeyUp) 这两个事件和前面的on(Keypress)相似,都是用来捕获键盘的按键事件的。不过,需要特别强调的是,OnClipEvent(KeyDown)和onClipEvent(KeyUp)这两个事件的功能要强大得多,将它们结合起来使用可以捕捉用户按下的组合键(比如CTRL+A),这比只能够捕捉单个按键动作的on(Keypress)要强大得多。比方说,如果我们需要捕捉用户按下CTRL+F的操作可以使用这样的代码: onClipEvent(keyUp) { if (Key.isDown(Key.CONTROL) && Key.isDown(70)) { //执行相应的操作 } } 这段代码中使用了内置对象Key,这个对象对于按键的处理非常有用。IsDown()方法用来监测某个键是否已经按下,这个函数的参数可以是键值比如70对应F键。也可以使用Key对象内置的键名称,比如Key.CONTROL就是指CTRL键。将这两个键是否按下的结果进行逻辑与运算(&&)就可以知道CTRL和F键是否同时按下。 2.4.5OnClipEvent(data) 如果某个影片剪辑实例进行了数据加载的操作,那么OnClipeEvent(data)事件会在数据加载完成的时候发生。比方说,我们在某个按钮的on(press)事件处理中加入了代码执行变量加载操作,并将代码加载函数loadVariables()的目标参数设置为某个影片剪辑。然后再为这个影片剪辑添加OnClipEvent(data)事件,当参数加载完毕之后,影片剪辑就会收到一个OnClipEvent(data)事件。 前面介绍了很多事件,但事实上Action Script提供的事件还有很多。除了键盘事件、鼠标事件等等这些非常直观的事件之外,还有一些比较“抽象”的事件。比方说,一段声音播放完成之后会产生一个事件,当用户调整播放器的窗口大小时也会产生一个事件。捕获并处理这些事件可以进一步提升Flash影片的互动性能。