Flash编程(AS2.0)教程-事件处理1932_第1页
Flash编程(AS2.0)教程-事件处理1932_第2页
Flash编程(AS2.0)教程-事件处理1932_第3页
Flash编程(AS2.0)教程-事件处理1932_第4页
Flash编程(AS2.0)教程-事件处理1932_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Flash编程(AS2.0)教程--处理事件事件,是推动Flash程序运行的灵魂,可以说,没有事件就没有Flash程序,真是因为有了丰富的事Flash程序时,我们需要花很大一部分精力去估计程件,Flash程序的交互性才能够得以实现。开发序应该处理哪些事件以及如何处理这些事件。击按钮所触发的事件?如果需要按钮对用户的更多操作作出反应,理代码。比方说对一个按钮,我们是不是只需要处理一下用户单那么我们就需要添加相应的事件处Flash程序可以处理的事件可谓多如牛毛,我们显然不能可能将他们一个一个罗列出了讲个所以然,其实这些事件的名称、作用和处理方法是相似的,只要掌握基本的原理,就可以一通百通。最重要的并不是了解每个事件的细节,行处理。而是要学会根据自己需要完成的程序所具有的功能选择适当的事件并进在第1章的实例中,自然语言来描述就是:我们已经使用代码处理了一个Press事件,事件处理代码的结构都是一样的,用当这个事件发生时(事件名称){执行这些操作}2.1鼠标和键盘事件鼠标事件可以说是应用最多的事件了,Flash应该如何作出反应。所以我们就从鼠标事件下手来看看当用户在屏幕上挥动鼠标时,2.1.1鼠标按下(on(press))如果某个界面元素(比如一个按钮或者一个影片剪辑的实例)的代码中含有on(press)这样的事件处理代码,那么当用户在这个界面元素上按下鼠标时,on(press)后面的大括号中的代码就会被执行。2.1.2鼠标释放(on(release))这个事件在鼠标健释放的时候发生,这个事件通常都是在on(press)之后发生的,有press才能有release嘛!举个例子来说,当我们需要处理用户单击某个按钮的事件时,就可以为这个按钮添加一个on(release)事件处理。尽管在这种情况下on(press)和on(release)的作用是相似的,因为通常press之后总会release,但是我们还是应当尽量使用on(release),为什么呢?因为如果使用on(press)会让你的按钮“过于敏感”——轻轻一按,代码立刻就被执行了,如果用户发现自己按错了,可就没有后悔药吃了。而当使用on(release)时,一旦用户发现按错了,可以按住鼠标按钮不放,将鼠标指针移动到按钮之外释放,代码就不会被执行,这才是比较人性化的按钮行为。2.1.3在外部释放鼠标(on(releaseOutside))当用户在某个按钮或者影片剪辑实例上按下鼠标(注意在这个按钮或者影片剪辑实例外面再释放鼠标,这时就会发生releaseOutside事件。我们可以在这个按钮或者影片剪辑的事件处理代码中添加on(releaseOutside)来捕获并,是按下鼠标按钮不放),然后拖动鼠标指针,处理这个事件。2.1.4鼠标悬停(on(rollOver))当鼠标指针在某个界面元素上面时,rollOver事件就会发生。这个事件最典型的应用是用来制作鼠标指向某个按钮或者影片剪辑实例时产生的反馈效果:比如按钮颜色变化、弹出菜单或者执行其他的一些操作。2.1.5鼠标移出(on(rollOut))这个事件和rollOver相对,很显然,当鼠标指针在一个界面元素上方运动鼠标指针移出这个界面对象的时候就会产生rollOut事件。rollOut事件的出路iherollOver事件的处理经常是成对出现的,比方说,我们捕捉rollOver事件,在on(rollOver)中弹出了了一个菜单,那么很我们还需要捕捉rollOut事件,在on(rollOver)中添加适当的代码将弹出的菜单隐藏起来,否则菜单就会一直显示在界面上。时产生rollOver事件,那么显然

2.1.6拖动掠过(on(dragOver)拖动操作我们都很熟悉,就是鼠标在某个对象上按下以后不释放,然后拖动鼠标。是当鼠标指针处于拖动状态时经过某个对象时发生的事件。事件打交道。dragOver事件就在制作拖动效果时,我们经常要和这样的2.1.7拖动移出(on(dragOut))从名字也能看出来,dragOut和dragOver恰好相反,也就是当鼠标处于拖动状态下时从一个对象上法移动出去时发生的事件。2.1.8键盘事件(On(keypress”<>”))当我们需要捕捉用户的按键操作时都需要使用这个事件,比方说如果需要捕获用户按下方向键左键的操作时可以使用On(keypress””),其他的以此类推。2.2实例前面简要介绍了一下几种常用的鼠标事件,下面我们就通过一个完整的例子来综合运用一下这些事件。首先建立一个场景,向其中添加三个影片剪辑实例,名称命名为eventTrapper_btn和dragTest_mc,hand_mc用来替换鼠标、hand_mc、message_txt、message_txt是一个动态文本,显示dragTest_mc则用来演示拖动反馈信息,eventTrapper_btn是按钮实例,用来捕捉各种鼠标事件,事件的处理。2.2.1自定义鼠标我们经常需要在Flash程序中使用自定义的鼠标指针,下面在这个例子中,我们将把鼠标指针换成自定义的外形。进入主场景,选择第一帧,在脚本面板中输入以下的代码:stop();Mouse.hide();startDrag("hand_mc",true);Message_txt.text="开始鼠标事件试验";第一句代码是stop(),也就是让影片播放到这里停下来一边等待用户的操作,startDrag则是开始对影片剪辑实例Mouse.hide()隐藏鼠标指针,紧接着hand_mc的拖动操作,由于前面已经将鼠标hand_mc作为拖动对象,而后面的指针隐藏,因此这个命令现在的作用相当于将鼠标指针替换为一个图标。注意看,两个参数,第一个作用很明显,就是将影片剪辑实例影片剪辑实例的中心和鼠标指针的中心锁定起来,如果设置为标在场景内首次单击的点的位置锁定起来。在这个例子中,我们使用标指针替换的效果,因此显然应当设置这个参数为startDrag后面有ture则是将false,那么影片剪辑的中心将会和鼠startDrag命令的目的是模拟鼠true。2.2.2捕捉并处理事件现在选中影片剪辑实例eventTrapper_btn,进入脚本面板,这里就将其一个个捕获,在这里我们可以编写一系列的事件处注意观察他们之间的异同。理代码。前面我们介绍了多个和鼠标相关的事件,on(rollOver){message_txt.text="鼠标浮动事件";}on(rollOut){message_txt.text="鼠标移出事件";}on(press){message_txt.text="鼠标单击事件}";on(dragOut){message_txt.text="鼠标在当前对象上按下左键后拖出";}on(release){message_txt.text="鼠标释放事件";}以上几个是比较简单的事件,下面我们再来处理稍微复杂一些的事件。选择影片剪辑实例dragTest_mc,然后再代码面板中输入这样的代码on(dragOver){this._alpha=this._alpha-10;}当用户按下鼠标左键并在dragTest_mc上拖动时,这个事件内部的代码就会被执行。this变量前dragTest_mc),_alpha是它的一面我们已经打过交道了,它的作用就是引用当前的对象(也就是个属性,透明度,这里我们通过一个简单的运算逐次降低其透明度,掉一样。最终的效果类似于图像被橡皮擦再选择按钮eventTrapper_btn,为其添加这样的代码:on(releaseOutside){eventTrapper_btn._x=_root._xmouse;eventTrapper_btn._y=_root._ymouse;}这段代码可以实现拖放效果,当用户在eventTrapper_btn外面释放时,eventTrapper_btn的位置(通过按钮就会移动了。eventTrapper_btn上按下鼠标左键并拖动,当鼠标在releaseOutside事件就会发生,在这个事件中我们将_x和_y坐标来定义)设置为当前鼠标释放时鼠标所处的坐标位置,上面是通过鼠标拖动的方式移动物体,其追加这样的代码。下面再试试看用键盘来实现,选择evnetTrapper_btn,为on(keypress""){eventTrapper_btn._x=eventTrapper_btn._x-6}on(keypress""){eventTrapper_btn._x=eventTrapper_btn._x+6}on(keypress""){eventTrapper_btn._y=eventTrapper_btn._y-6}on(keypress""){eventTrapper_btn._y=eventTrapper_btn._y+6}这四个事件的作用是很明显的,当用户按向左键时(发生keypress””事件),将eventTrapper_btn._x的值减小2.2.3影片剪辑和按钮6个单位,以此类推,其他的代码含义就不难理解了。从前面的实例可以看出,影片剪辑的实例也是可以拥有自身的事件处理代码的。但是在使用影片剪辑实例事件时必须注意以下几个问题:我们可以为影片剪辑实例添加原本由按钮捕捉的事件,比如注意,影片剪辑实例虽然可以捕捉这样的事件,rollOver、rollOut等等。不过要特别但是在这些事件的处理中我们不能直接引用其他的对象,一般我们只对影片剪辑自身的属性进行修改,比如前面影片剪辑实例是一个例子。我们可以在这个事件的处理中修改影片剪辑实例dragTest_mc处理事件就dragTest_mc的透明度,但是不要指在执行过程中,这样的望在其中简单地加上message_txt.text=“”这样的代码就能修改反馈区的内容。代码是不会有效果的,而且一是用按钮代替影片剪辑,这样程序又能够执行。Flash不会报错,这经常会让初学者感到晕头转向。解决的方法有两个,其次是对上面的代码进行一下小修改,改成:_root.message_txt.text=””,_root是Flash提供的一个内置对象,通过它可以准确地定位界面上的元素。鼠标指针在其上方会显示为一个小手,rollOver事件,并加入这样的代码。当某个影片剪辑实例被赋予了鼠标事件之后,为了避免这种情况出现,可以让它捕捉on(rollOver){this.useHandCursor=false;}useHandCursor这个属性就是设置当鼠标在当前对象上悬浮时是否显示手形指针,默认值为true,也就是显示手形指针,这里将其设置为false就不会显示了。我们可以为按钮实例指定名称(后缀一般用_btn),不过不要有错觉,按钮实例和影片实例还是很多区别的。最重要的点就是,按钮没有自己的时间线,而影片剪辑则有自己的时间线。这是什么意思呢?简单地说,这点区别在了这样的事件处理代码:this的使用上面体现出来。比方说,如果我们为一个影片剪辑实例添加on(press){this._rotation=30;}当你在这个影片剪辑实例上单击鼠标左键时,影片剪辑实例将会发生旋转。但是如果你将这样的代码赋予一个按钮实例,那么当你单击这个按钮时,将不会是按钮自身旋转而是按钮的父对象旋转。很多情况下,这种奇怪的现象会让分不清按钮实例和影片剪辑实例之间微小区别的用户答感困惑。再来看一个前面举过的一个例子on(releaseOutside){eventTrapper_btn._x=_root._xmouse;eventTrapper_btn._y=_root._ymouse;}这行代码中,你也许会觉得eventTrapper_btn._x这样的语句太繁琐,用this._x多方便直接呢?但是在前面的那个例子中,否则运行的效果会和我们如果这段时间处理代码是赋予影片剪辑实例的话,这样做就没有问题,这段代码是提供给按钮实例使用的,所以必须清楚明白地讲清楚移动的对象,预先的设想大相径庭。如果你需要使用一个影片剪辑代替按钮的话,可以考虑在其内部添加特殊的标签(_up、_over、hitArea属性,_down),然后编写相应的代码。另外,每个按钮都会有一个“热区”,也就是单击有效的区域,通常就是按钮的图形覆盖的范围,例如如果你需要修改这个区域的范围可以使用影片剪辑实例的myClipButton_mc.hitArea=_root.myHitClip_mc;总的来说,按钮够实现的功能,影片剪辑都能实现,而影片剪辑能够实现的功能按钮则未必能够实现。那还要按钮有什么用?这主要是由于,按钮是程序界面使用极其频繁的元素,类型可以提高设计的效率。提供专门的按钮2.3帧事件2.3.1帧事件简介帧事件和前面介绍的鼠标事件以及键盘事件的主要区别在于,每当影片播放指定的帧时,帧事件内部的代码就会被执行。在帧事件并不是一个交互式的事件。Flash的开发环境中,帧事件在时间线上会有一个“a”标记。在具体的设计中,帧事件的用处是非常多的。比方说影片的第1帧总是受到垂青的,因为我们一般总是要在这一帧当中对程序进行一些初始化操作,比方说定义变量、函数等等。再比如,在很多交互式的程序中,我们一般要在需要等待用户输入(比如单击一个按钮)的时候,选择恰当的帧插入一个帧事件,并在其中输入stop()或者类似的代码。2.3.2帧事件应用实例为了演示帧事件的原理和使用方法,我们将制作一个播放幻灯片的小程序。程序的界面上有一个图片显示区域(影片剪辑实例,名称为picture_mc),一个反馈信息显示区域(含两个动态文本,message_txt和caption_txt)和一个播放控制按钮区域(包含三个按钮,功能分别是播放、暂停和复位,名称分别是play_btn、pause_btn和rewind_btn)。名称分别为这个程序实现的功能并不复杂,首先picture_mc会自动每隔一段时间切换一幅图片,用户可以在下面的播放控制栏中单击按钮来播放、暂停或者复位动画的播放。2.3.2.1图片播放1、打开库面板(快捷键Ctrl+L),单击左下角的添加按钮添加,选择新元件类型为“影片剪辑”,进入这个影片剪辑的编辑状态。2、添加两个层,分别命名为“图片”和“脚本”,在“图片”层中当,添加若干个空白关键帧,然后在时候图片位置错误。每一个关键帧内部贴上一幅图片,调整各幅图片的位置和大小,以免播放的3、逐一选择“控制”层中当的帧,分别输入类似这样的代码stop();_root.caption_txt.text="水瓶座";第一行的作用是让影片剪辑的播放停止下来,也就是显示图片,然后等待主场景发送过来的事件继续播放,紧接下来的那个语句用于在主场景中显示图片内容的提示,因此每一个帧_root.caption_txt.text=””中后面引号里面的内容是不一样的。注意,这里的_root是必不可少的,否则代码执行的时候会找不到对象,别忘了,我们现在正在编辑一个影片剪辑自身的事件线,而他又要引用顶头上司(主场景)中的对象,不加上完整的头衔,自然在运行的时候是找不到对象的了。中4、在“控制”层中多添加一个帧,在这个帧的时间处理代码中输入gotoAndPlay(1)这句代码的作用是让影片播放完成之后重新回到第一帧重新播放。2.3.2.2图片的自动切换1、回到主场景中,将上一步制作好的影片剪辑拖放到场景中并将其命名为picture_mc,调整其长度为45帧。2、添加一picture_mc中的图片自动切换。标题,由影片剪辑picture_mc自身的代码个动态文本,命名为message_txt,我们将用它来显示倒计时,倒计时完成时,另外还要添加一个名称为caption_txt的动态文本,它将显示图片的来控制。3、新建一个层,命名为倒计时,调整其长度为45帧左右,在0、15、30帧处,分别添加帧事件,代码内容分别是:message_txt.text="图片将在3秒后切换message_txt.text="图片将在2秒后切换message_txt.text="图片将在1秒后切换";";";在第45帧上添加这样的代码:picture_mc.nextFrame();gotoAndPlay(1);前面三个帧事件的作用是显示倒计时,最后45帧上的代码有两行组成,第一行让影片剪辑实例picuture_mc向后跳一帧。这样就形成了倒计时完成切换图片的效果。接下来的gotoAndPlay(1)的作用是退回到影片的第一帧,开始新一轮的倒计时。2.3.2.3按钮控制1、添加一个新层,命名为2、制作三个按钮,“按钮”,调整其长度为45帧。将其拖放到图层“按钮”中,将其分别命名为play_btn、stop_btn和rewind_btn。3、为以上三个按钮分别添加上这样的代码。on(release){play();}on(release){stop();}on(release){gotoAndPlay(1);pictures_mc.gotoAndStop(1);}这三段代码中,前两段非常直接,只要对影片进行播放或者停止操作就万事大吉了。最后一段是进行复位的,有两行,因为影片本身和影片剪辑实例都需要复位,所以略为显得罗嗦一点。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参数,实现大炮随着鼠标指针的运动而旋转的效果。MouseDown和MouseUp的含义也就不难理解了。搞懂了mouseMove事件,2.4.4OnClipEvent(keyDown)和onClipEvent(KeyUp)这两个事件和前面的on(Keypress)相似,都是用来捕获键盘的按键事件的。不过,需要特别强调的是,OnClipEvent(KeyDown)和onClipEvent(KeyUp)这两个事件的功能要强大得多,将它们结合起来使用可以捕捉用户按下的组合键(比如CTRL+A),这比只能够捕捉单个按键动作的CTRL+F的操作可以使用这样的代码:on(Keypress)要强大得多。比方说,如果我们需要捕捉用户按下onClipEvent(keyUp){if(Key.isDown(Key.CONTROL)&&Key.isDown(70)){//执行相应的操作}}这段代码中使用了内置对象Key,这个对象对于按键的处理非常有用。这个函数的参数可以是键值比如70对应F键。也可以使用CTRL键。将这两个键是否按下的结果进行逻辑与运算(IsDown()方法用来监测某Key对象内置的键名&&)就可个键是否已经按下,称,比如以知道Key.CONTROL就是指CTRL和F键是否同时按下。2.4.5OnClipEvent(data)如果某个影片剪辑实例进行了数据加载的操作,那么OnClipeEvent(data)事件会在数据加载完成on(press)事件处理中加入了代码执行变量加载操作,并将loadVariables()的目标参数设置为某个影片剪辑。然后再为这个影片剪辑添加OnClipEvent(data)事件,当参数加载完毕之后,影片剪辑就会收到一个的时候发生。比方说,我们在某个按钮的代码加载函数OnClipEvent(data)事件。前面介绍了很多事件,但事实上ActionScript提供的事件还有很多。除了键盘事件、鼠标事件等等这些非常直观的事件之外,还有一些比较“抽象”的事件。比方说,一段声音播放完成之后会产生一个事件,当用户调整播放器的窗口大小时也会产生一个事件。捕获并处理这些事件可以进一步提升Flash影片的互动性能。2.5事件处理函数说完了常用的事件,在来说说事件处理的两种不同方式。添加的:首先,选择将要捕获事件的对象(影片剪辑实例或者按钮),接着,打开脚本面板,然后编写“on事件名称”的代码。比方说,如果我们要让一个影片剪辑实例捕捉以先在场景中选择这个影片剪辑实例(假设其名称为前面介绍的事件处理代码的方法是这样mouseDown事件,那么可movieClip_mc),然后为其设置如下等的代码。onClipEvent(mouseDown){}这种方法用起来简洁直观,但是它有一个缺点是——交互性不足。怎么说呢?这种方法建立起来的事件处理代码是“固定”的,不能在程序运行的过程中动态更改。比方说,我们如果我们希望这个影片剪辑在影片播放到第10帧的时候使用某一段代码来处理mouseDown事件,但是当影片播放到第mouseDown事件。这样的应用你是不是没有遇到过,电视机的遥控器上很多按钮都是“多模态”的,20帧的时候,我们有需要另外一段代码来处理来举一个直观的例子说,我们都使用过电视机的遥控器,也就是说,这些按钮在不同的状态下功能是不同的。音量的,但是如果你进入了颜色设置模式时,按同样的按钮调节的不是再音量而是颜色了。仍然举上面的例子来说明,如果我们在影片的某一个帧中加入这样的代码调节声音的按钮在正常状态下是用来提高和减小movieClip_mc.onMouseDown=function(){}就可以实现对事件处理代码的动态切换了。这个语句比较特殊,它是说,将影片剪辑实例movieClip_mc的onMouseDown事件处理代码用新的事件处理代码。你可以影片中多次使用这种方法,只要每次后面function()代替,而function()后面的大括号中就是function()函数的内容不同就可以实现事件处理代面的动态调整了。需要注意的时候,使用这种方法定义事件处理代码是,影片剪辑实例必须出现在场景中,当它从场景中消失后,事件处理代码将会自动删除,如果要再次使用,必须重新指定。如果想删除时间的处理代码可以使用deletemovieClip_mc.onMo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论