学院首页>图形图像>FLASH>Flash MX 编程深层次应用-初级特效(5)

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

作者: 来源: 添加时间:2006-5-23 7:27:00
2.3 综合特效

 

由于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

站内搜索