查看完整版本: Flash MX 编程深层次应用-初级特效(5)

冰冷的心 2007-12-10 20:04

Flash MX 编程深层次应用-初级特效(5)

</script></div><font id="zoom"><DIV style="FONT-SIZE: 18px; COLOR: #990000; FONT-FAMILY: ; 宋体: " align=center>2.3 综合特效</DIV><DIV style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%" align=left><BR>&nbsp;&nbsp;&nbsp;&nbsp; <P class=MsoNormal><SPAN style="FONT-FAMILY: 幼圆">由于</SPAN><SPAN lang=EN-US>Flash MX</SPAN><SPAN style="FONT-FAMILY: 幼圆">功能非常强大,有些特效很难去界定它的属性与类别,甚至只能说它是完成了某一个功能,不能说是特效了。比如鼠标跟随,这种特效对画面的贡献有多大,很难讲清楚;又比如说一个很酷的飞行菜单或者旋转菜单,乃至其他各种类别的菜单,都是不错的特效;还有一些多媒体的一些功能,比如声音的播放、麦克风与摄像头的使用等都属于这个范畴。</SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 15pt; FONT-FAMILY: 'Times New Roman'"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN><H3><SPAN lang=EN-US>2.3.1&nbsp; </SPAN><SPAN style="FONT-FAMILY: 方正隶书简体">多边形鼠标跟随</SPAN></H3><P class=MsoNormal><SPAN style="FONT-FAMILY: 幼圆">在众多</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 幼圆">特效中,大家比较喜欢讨论的一个效果就是鼠标跟随。这种效果在过去讨论得非常多,但最近一年来,由于大家都把注意力放在卡通动画与</SPAN><SPAN lang=EN-US>MTV</SPAN><SPAN style="FONT-FAMILY: 幼圆">动画制作方面,所以已经很少有人关注这种特效了。但是没有人关注并不代表它没有用,它在很多动画中还有一定的应用空间,让我们先看看下面的程序吧:</SPAN></P><P class=a3><SPAN lang=EN-US>_root.createEmptyMovieClip("c",1);</SPAN></P><P class=a3><SPAN lang=EN-US>colorMe = new Color(c);</SPAN></P><P class=a3><SPAN lang=EN-US>Mouse.addListener(_root);</SPAN></P><P class=a3><SPAN lang=EN-US>_root.onMouseDown = function() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">当第一次鼠标按下时,鼠标跟随开始</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c.clear();</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">设定画线的线宽为</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 幼圆">,颜色值默认,透明度为</SPAN><SPAN lang=EN-US>100</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c.lineStyle(1,'',100);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; radius = Math.random()*100+50;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">随机生成一个多边形,边数从</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 楷体_GB2312">~</SPAN><SPAN lang=EN-US>12</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; sides = Math.ceil(Math.random()*10)+2;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">计算多边形与圆心的夹角</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; radInc = (2*Math.PI)/sides;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">根据夹角画线,移到中心位置的正下方</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c.moveTo(radius*Math.sin(0),radius*Math.cos(0));</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;sides;i++) {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">画边线</SPAN></P><P class=a3><SPAN lang=EN-US>c.lineTo(radius*Math.sin(i*radInc),radius*Math.cos(i*radInc));</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</SPAN></P><P class=a3><SPAN lang=EN-US>//</SPAN><SPAN style="FONT-FAMILY: 幼圆">画最后一条闭合线</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c.lineTo(radius*Math.sin(0),radius*Math.cos(0));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></P><P class=a3><SPAN lang=EN-US>}</SPAN></P><P class=a3><SPAN lang=EN-US>_root.onEnterFrame = function() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">复制一个前面画的正多边形</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c.duplicateMovieClip("c"+((j&lt;2) ? j=2 : ++j),j);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">调整多边形的中心位置,以</SPAN><SPAN lang=EN-US>80%</SPAN><SPAN style="FONT-FAMILY: 幼圆">的速度向鼠标当前位置靠拢</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c._x += (_root._xmouse-c._x)*.2;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; c._y += (_root._ymouse-c._y)*.2;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root["c"+j].onEnterFrame = function() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">设置透明度与旋转,每移动一下透明度就减</SPAN><SPAN lang=EN-US>5</SPAN><SPAN style="FONT-FAMILY: 幼圆">,然后旋转</SPAN><SPAN lang=EN-US>5</SPAN><SPAN style="FONT-FAMILY: 幼圆">度</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._alpha -= 5;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._rotation += 5;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; }</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">设置颜色值</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; myTrans={rb:String((c._x/550)*255),bb:String((c._y/400)*255),gb:'127',ab:'100'};</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; colorMe.setTransform(myTrans);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">保证最多只有</SPAN><SPAN lang=EN-US>20</SPAN><SPAN style="FONT-FAMILY: 幼圆">个多边形跟随</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root["c"+(j-20)].removeMovieClip();</SPAN></P><P class=a3><SPAN lang=EN-US>}</SPAN></P><P class=MsoNormal><SPAN style="FONT-FAMILY: 幼圆">这个鼠标跟随效果虽然不是很酷,但是却说明了一个非常重要的问题,就是要真正学好编程就要有相当的数学基础。比如这里的多边形画线原理就是任何正多边形的顶点都在一个圆上,而圆心到正多边形的顶点的距离都等于圆的半径,角度很明显就是</SPAN><SPAN lang=EN-US>360</SPAN><SPAN style="FONT-FAMILY: 幼圆">°除以边数了,如图</SPAN><SPAN lang=EN-US>2-22</SPAN><SPAN style="FONT-FAMILY: 幼圆">所示。</SPAN></P><P class=a2 align=center><SPAN lang=EN-US><IMG height=220 src="http://act.it.sohu.com/book/data/book/11/311/021.files/image037.jpg" width=228></SPAN></P><P class=a0 align=center><SPAN style="FONT-FAMILY: 宋体">图</SPAN><SPAN lang=EN-US>2-22</SPAN></P><P class=MsoNormal><SPAN style="FONT-FAMILY: 幼圆">上面的程序是用弧度代替了角度,其实质是一样的!于是只要有了一个顶点的位置,根据角度加上三角函数运算就可以求出所有顶点的位置,从而画出任意边数的正多边形了!</SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 15pt; FONT-FAMILY: 'Times New Roman'"><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN><H3><SPAN lang=EN-US>2.3.2&nbsp; MP3</SPAN><SPAN style="FONT-FAMILY: 方正隶书简体">播放器</SPAN></H3><P class=MsoNormal><SPAN style="FONT-FAMILY: 幼圆">在以前,要取得外部声音文件比较麻烦,需要将每一个声音文件转化成</SPAN><SPAN lang=EN-US>SWF</SPAN><SPAN style="FONT-FAMILY: 幼圆">格式,由主控部分用</SPAN><SPAN lang=EN-US>loadMovie</SPAN><SPAN style="FONT-FAMILY: 幼圆">的方法调入,然后才可以正常播放。但是到了</SPAN><SPAN lang=EN-US>Flash MX</SPAN><SPAN style="FONT-FAMILY: 幼圆">,这种调入外部声音文件的方法变得很简单,只需一个</SPAN><SPAN lang=EN-US>loadSound</SPAN><SPAN style="FONT-FAMILY: 幼圆">语句便可以轻松地得到解决。让我们看看用这个功能制作的</SPAN><SPAN lang=EN-US>MP3</SPAN><SPAN style="FONT-FAMILY: 幼圆">播放器吧:</SPAN></P><P class=a3><SPAN lang=EN-US>function playSong() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">播放声音函数</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; songIndex = (songIndex == undefined) ? 0 : songIndex;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; dongua_sound = new Sound();</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">当歌曲播放结束时换一首歌</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; dongua_sound.onSoundComplete = changeSong;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">取外部声音文件</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; currentFile = fileList[songIndex];</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; dongua_sound.loadSound(currentFile, true);</SPAN></P><P class=a3><SPAN lang=EN-US>}</SPAN></P><P class=a3><SPAN lang=EN-US>function changeSong() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; songIndex = (++songIndex)%fileList.length;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; playSong();</SPAN></P><P class=a3><SPAN lang=EN-US>}</SPAN></P><P class=a3><SPAN lang=EN-US>_global.formatTime = function(milliseconds) {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">计算声音的分钟数</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; var s = "00"+parseInt(milliseconds/1000%60);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; return parseInt(milliseconds/1000/60)+":"+s.substr(s.length()-2);</SPAN></P><P class=a3><SPAN lang=EN-US>};</SPAN></P><P class=a3><SPAN lang=EN-US>//</SPAN><SPAN style="FONT-FAMILY: 幼圆">显示播放进度条所放的位置</SPAN></P><P class=a3><SPAN lang=EN-US>begin_x = 100;</SPAN></P><P class=a3><SPAN lang=EN-US>begin_y = 130</SPAN></P><P class=a3><SPAN lang=EN-US>this.createTextField("txtDisplay", 2, begin_x, begin_y, 300, 20);</SPAN></P><P class=a3><SPAN lang=EN-US>txtDisplay.setNewTextFormat(new TextFormat("_sans", null, null, true, null, null, null, null, "center"));</SPAN></P><P class=a3><SPAN lang=EN-US>//</SPAN><SPAN style="FONT-FAMILY: 幼圆">播放器列表</SPAN></P><P class=a3><SPAN lang=EN-US>fileList = ["1.mp3", "2.mp3", "3.mp3", "4.mp3", "5.mp3"];</SPAN></P><P class=a3><SPAN lang=EN-US>playSong();</SPAN></P><P class=a3><SPAN lang=EN-US>_root.onEnterFrame = function() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">显示歌曲的名称</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; this.txtDisplay.text = "NOW PLAYING: "+currentFile.split(".")[0];</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">显示歌曲的进度及总长度</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; this.txtDisplay.text += " ("+formatTime(dongua_sound.position)+" / "+formatTime(dongua_sound.duration)+")";</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">用直线线段显示播放比例</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root.clear();</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root.moveTo(begin_x, begin_y+10);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root.lineStyle(20, 0x8080FF, 100);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root.lineTo(300*(dongua_sound.position/dongua_sound.duration)+begin_x, begin_y+10);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root.lineStyle(20, 0x8080FF, 25);</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; _root.lineTo(begin_x+300, begin_y+10);</SPAN></P><P class=a3><SPAN lang=EN-US>};</SPAN></P><P class=a3><SPAN lang=EN-US>prev.onPress = function() {</SPAN></P><P class=a3><SPAN lang=EN-US>//</SPAN><SPAN style="FONT-FAMILY: 幼圆">播放下一首</SPAN></P><P class=a3><SPAN lang=EN-US>songIndex = (++songIndex)%fileList.length;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; dongua_sound.stop();</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; playSong();</SPAN></P><P class=a3><SPAN lang=EN-US>};</SPAN></P><P class=a3><SPAN lang=EN-US>back.onPress = function() {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; //</SPAN><SPAN style="FONT-FAMILY: 幼圆">播放上一首</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; songIndex = (--songIndex)%fileList.length;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; if (songIndex&lt;0) {</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; songIndex = fileList.length-1;</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; }</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; dongua_sound.stop();</SPAN></P><P class=a3><SPAN lang=EN-US>&nbsp;&nbsp;&nbsp; playSong();</SPAN></P><P class=a3><SPAN lang=EN-US>};</SPAN></P><P class=MsoNormal><SPAN style="FONT-FAMILY: 幼圆">程序中</SPAN><SPAN lang=EN-US>prev</SPAN><SPAN style="FONT-FAMILY: 幼圆">与</SPAN><SPAN lang=EN-US>back</SPAN><SPAN style="FONT-FAMILY: 幼圆">分别代表两个按钮,一个是控制往前跳转的,一个是控制向后跳转的。这个播放器不但有</SPAN><SPAN lang=EN-US>load</SPAN><SPAN style="FONT-FAMILY: 幼圆">功能,还有前进与后退功能。运行画面如图</SPAN><SPAN lang=EN-US>2-23</SPAN><SPAN style="FONT-FAMILY: 幼圆">所示。虽然在读取外部的声音文件后,播放的时候可以取得其播放进度,但是却无法在停止之后重新从该停止位置继续播放,甚至都无法再对其进行播放,惟一的办法就是再次</SPAN><SPAN lang=EN-US>load</SPAN><SPAN style="FONT-FAMILY: 幼圆">它。不知这是不是</SPAN><SPAN lang=EN-US>Flash MX</SPAN><SPAN style="FONT-FAMILY: 幼圆">的</SPAN><SPAN lang=EN-US>Bug</SPAN><SPAN style="FONT-FAMILY: 幼圆">?</SPAN></P><P class=a2 align=center><SPAN lang=EN-US><IMG height=183 src="http://act.it.sohu.com/book/data/book/11/311/021.files/image038.jpg" width=305></SPAN></P><P class=a0 align=center><SPAN style="FONT-FAMILY: 宋体">图</SPAN><SPAN lang=EN-US>2-23</SPAN></P></DIV></font>
页: [1]
查看完整版本: Flash MX 编程深层次应用-初级特效(5)