Flash MX 编程深层次应用-初级特效(5)
作者: 来源: 添加时间:2006-5-23 7:27:00由于Flash MX功能非常强大,有些特效很难去界定它的属性与类别,甚至只能说它是完成了某一个功能,不能说是特效了。比如鼠标跟随,这种特效对画面的贡献有多大,很难讲清楚;又比如说一个很酷的飞行菜单或者旋转菜单,乃至其他各种类别的菜单,都是不错的特效;还有一些多媒体的一些功能,比如声音的播放、麦克风与摄像头的使用等都属于这个范畴。
2.3.1 多边形鼠标跟随
在众多Flash特效中,大家比较喜欢讨论的一个效果就是鼠标跟随。这种效果在过去讨论得非常多,但最近一年来,由于大家都把注意力放在卡通动画与MTV动画制作方面,所以已经很少有人关注这种特效了。但是没有人关注并不代表它没有用,它在很多动画中还有一定的应用空间,让我们先看看下面的程序吧:
_root.createEmptyMovieClip("c",1);
colorMe = new Color(c);
Mouse.addListener(_root);
_root.onMouseDown = function() {
//当第一次鼠标按下时,鼠标跟随开始
c.clear();
//设定画线的线宽为1,颜色值默认,透明度为100
c.lineStyle(1,'',100);
radius = Math.random()*100+50;
//随机生成一个多边形,边数从3~12
sides = Math.ceil(Math.random()*10)+2;
//计算多边形与圆心的夹角
radInc = (2*Math.PI)/sides;
//根据夹角画线,移到中心位置的正下方
c.moveTo(radius*Math.sin(0),radius*Math.cos(0));
for(i=0;i<sides;i++) {
//画边线
c.lineTo(radius*Math.sin(i*radInc),radius*Math.cos(i*radInc));
}
//画最后一条闭合线
c.lineTo(radius*Math.sin(0),radius*Math.cos(0));
}
_root.onEnterFrame = function() {
//复制一个前面画的正多边形
c.duplicateMovieClip("c"+((j<2) ? j=2 : ++j),j);
//调整多边形的中心位置,以80%的速度向鼠标当前位置靠拢
c._x += (_root._xmouse-c._x)*.2;
c._y += (_root._ymouse-c._y)*.2;
_root["c"+j].onEnterFrame = function() {
//设置透明度与旋转,每移动一下透明度就减5,然后旋转5度
this._alpha -= 5;
this._rotation += 5;
}
//设置颜色值
myTrans={rb:String((c._x/550)*255),bb:String((c._y/400)*255),gb:'127',ab:'100'};
colorMe.setTransform(myTrans);
//保证最多只有20个多边形跟随
_root["c"+(j-20)].removeMovieClip();
}
这个鼠标跟随效果虽然不是很酷,但是却说明了一个非常重要的问题,就是要真正学好编程就要有相当的数学基础。比如这里的多边形画线原理就是任何正多边形的顶点都在一个圆上,而圆心到正多边形的顶点的距离都等于圆的半径,角度很明显就是360°除以边数了,如图2-22所示。

图2-22
上面的程序是用弧度代替了角度,其实质是一样的!于是只要有了一个顶点的位置,根据角度加上三角函数运算就可以求出所有顶点的位置,从而画出任意边数的正多边形了!
2.3.2 MP3播放器
在以前,要取得外部声音文件比较麻烦,需要将每一个声音文件转化成SWF格式,由主控部分用loadMovie的方法调入,然后才可以正常播放。但是到了Flash MX,这种调入外部声音文件的方法变得很简单,只需一个loadSound语句便可以轻松地得到解决。让我们看看用这个功能制作的MP3播放器吧:
function playSong() {
//播放声音函数
songIndex = (songIndex == undefined) ? 0 : songIndex;
dongua_sound = new Sound();
//当歌曲播放结束时换一首歌
dongua_sound.onSoundComplete = changeSong;
//取外部声音文件
currentFile = fileList[songIndex];
dongua_sound.loadSound(currentFile, true);
}
function changeSong() {
songIndex = (++songIndex)%fileList.length;
playSong();
}
_global.formatTime = function(milliseconds) {
//计算声音的分钟数
var s = "00"+parseInt(milliseconds/1000%60);
return parseInt(milliseconds/1000/60)+":"+s.substr(s.length()-2);
};
//显示播放进度条所放的位置
begin_x = 100;
begin_y = 130
this.createTextField("txtDisplay", 2, begin_x, begin_y, 300, 20);
txtDisplay.setNewTextFormat(new TextFormat("_sans", null, null, true, null, null, null, null, "center"));
//播放器列表
fileList = ["1.mp3", "2.mp3", "3.mp3", "4.mp3", "5.mp3"];
playSong();
_root.onEnterFrame = function() {
//显示歌曲的名称
this.txtDisplay.text = "NOW PLAYING: "+currentFile.split(".")[0];
//显示歌曲的进度及总长度
this.txtDisplay.text += " ("+formatTime(dongua_sound.position)+" / "+formatTime(dongua_sound.duration)+")";
//用直线线段显示播放比例
_root.clear();
_root.moveTo(begin_x, begin_y+10);
_root.lineStyle(20, 0x8080FF, 100);
_root.lineTo(300*(dongua_sound.position/dongua_sound.duration)+begin_x, begin_y+10);
_root.lineStyle(20, 0x8080FF, 25);
_root.lineTo(begin_x+300, begin_y+10);
};
prev.onPress = function() {
//播放下一首
songIndex = (++songIndex)%fileList.length;
dongua_sound.stop();
playSong();
};
back.onPress = function() {
//播放上一首
songIndex = (--songIndex)%fileList.length;
if (songIndex<0) {
songIndex = fileList.length-1;
}
dongua_sound.stop();
playSong();
};
程序中prev与back分别代表两个按钮,一个是控制往前跳转的,一个是控制向后跳转的。这个播放器不但有load功能,还有前进与后退功能。运行画面如图2-23所示。虽然在读取外部的声音文件后,播放的时候可以取得其播放进度,但是却无法在停止之后重新从该停止位置继续播放,甚至都无法再对其进行播放,惟一的办法就是再次load它。不知这是不是Flash MX的Bug?

图2-23