简介:在flash中所有的东西都基于事件(event)。这些事件可以是用户触发的诸
如onMouseDown event或者是按下按钮,还可以是flash时间线上帧的移动的结果。
利用后着的例子,常常是运用onEnterFrame event,它允许一个命令或一系列命令
在每一帧被触发。运用这些AS,可以使得动画和主时间线同步发生。但是,随主时
间线的播放进程严格的基于影片设定的帧频或者说FPS (FramesPer Second) 。这
意味着你使用onEnterFrame event事件的动画将在每一帧以每秒发生FPS次的方式
播放。例如,你的电影的帧频是12frame/S,那么onEnterFrameevent就将一秒发生
12次。SetInterval 是FLASHMX的一种函数。它允许你使用自己乐意的基于时间的
事件,有点类似onEnterFrameevent,但它是你自己定义的时间间隔。
为了避免所有的onEnterFrame面临的复杂性,我们可以使用SetInterval。它如
同在美妙的音乐里夹杂的稳健的鼓声。通常鼓点都是很简单的重复打击鼓来配合乐
曲。如果你在你的CD里放一个打击乐,你将听到伴随鼓点的歌曲。按下停止键你将
停止了歌曲,听不到鼓点。SetInterval和其原理类似,就象是flash影片(歌曲)
里面播放鼓点的CD机,只要你告诉SetInterval你想让鼓点敲击的多快。当然,在
flash里,你无必要敲鼓,只是写一些代码。在教程开始前,我们看看JS里类似的函
数是如何运用的。
JS里设定延时:
每一个熟悉JS的人,将感觉使用SetInterval很顺手因为它和JS里设定延时函数
setTimeout 很类似。setTimeout运用在延迟一段时间,再进行某项操作。例如,
靠他,我们可以做一个连结,只有在点击后2秒的延迟,才会弹出窗口。下面给出例
子:
<script>
function ShowMessage(){
alert("Click!");
}
</script>
<a href="javascript: ID = setTimeout('ShowMessage()',2000);
void(0);">Clickhere</a><br>
它就是当你点击后,调用setTimeout来延时2秒。setTimeout靠操作clearTimeout()
来打断延时。在上述例子的实例里,你想防止窗口突然跳出,你需要用
clearTimeout()来作为返回值。例子:
<script>
function ShowMessage2(){
alert("Click!");
ID = setTimeout('ShowMessage2()', 2000);
}
</script>
<a href="javascript: ID = setTimeout('ShowMessage2()',2000);
void(0);">Clickhere</a><br>
<a href="javascript: clearTimeout(ID);">Killalert</a>
如果Killalert在点击连接后2秒内点击,延时函数将被制止,ShowMessage()也不
会被执行。
AS里的setInterval
setInterval和setTimeout是相似的但有些不同。最大的区别是setInterval创
建一个动作连续不断的调用执行函数——象打击鼓点一样。setTimeout,如同上面
所说,将执行一次,然后就停止。一个setTimeout函数可以再次调用自己来模拟事
件的再次发生。例子:
<script>
function ShowMessage2(){
alert("Click!");
ID = setTimeout('ShowMessage2()', 2000);
}
</script>
<a href="javascript: ID = setTimeout('ShowMessage2()',2000);
void(0);">Clickhere</a><br>
<a href="javascript: clearTimeout(ID);">Killalert</a>
当Click here被点击后,弹出窗体的信息将在2秒后显示并且循环执行,除非Kill
alert被点击后调用clearTimeout来清除setTimeout。这是你必须理解的,因为
setInterval 不能用在onEnterFrame事件中。setInterval不意味着可以在快速连
续进程中连续调用。它,通过自身,来在一段间隔后来成功的调用函数。它相较
onEnterFrame而言,不是每帧都要调用函数。当然,如果指定的时间过去了,
onEnterFrame也就不能再被叫做onEnterFrame事件了。
另一点不同的是setTimeout传递的是一个需要被执行的Javascript命令。
SetInterval,传递的是将在时间间隔里被执行的函数(不带“()”),允许你在
Interval参数后定义函数参数。SetInterval允许用两种方法来调用。
1) 直接调用 2)间接引用
1. setInterval ( function, interval [, arg1, arg2, …, argn]);
2. setInterval ( object, "methodName", interval [, arg1, arg2, …,argn]
);
1的例子:
DisplayTrace = function(message){
trace(message);
}
ID = setInterval(DisplayTrace, 2000, "Interval called");
首先,函数被定义。setInterval将在指定的间隔里被调用,在这个例子里,是
2000毫秒。在第二个参数interval后的参数,用来传递给函数。这里,就是
"Intervalcalled"。看到的效果是,函数被调用后,在output窗口将看到Interval
called。
第一种用法基于直接调用函数。但很多时候需要调用一个对象函数,包括对象的属
性。第二种方法就派上了用处。
myObj = new Object();
myObj.DisplayTrace = function(message){
trace(message);
}
ID = setInterval(myObj, "DisplayTrace", 2000, "Intervalcalled");
这里setInterval是通过指针的方式来调用函数的。这意味着函数必须在对象体内
被调用。
另外,setInterval 返回的间隔可以用clearInterval()函数来阻止间隔继续。
clearInterval类似JS的clearTimeout。就是setInterval的反意。间隔标识符,比如
在上面例子的ID,它将作为setInterval的返回值来制止多次的调用子函数:
clearInterval(ID);
需要申明的是在每一个setInterval的调用中,无法同时调用子函数。子函数只有
在时间间隔到了后才会执行。子函数在应用了setInterval后,如果你尝试调用它
,你将得到一个错误的值,因为它没被运行。你确实想要子函数立即执行,它将在
调用setInterval之后被直接调用。
ID = setInterval(DisplayTrace, 2000, "Interval called");
DisplayTrace("Interval called");
总结:
综上所述,setInterval允许你在自己设定的时间段里来达到和onEnterFrame不
一样的事件,并不基于电影的帧频率。关键需要理解的是,setInterval完全独立
于时间轴。这意味着你的setInterval事件将以它被设定的时间来运行,无关FLASH
的帧频。用简单的话说,如果你的影片以FPS每秒12次运行,而你有个大的MC要从
左运动到右面且在24帧后重复它。如果你建立一段每2秒发生的间隔,大的MC将不会
精确的在2秒后重复运动而是稍微慢点,这样interval的调用将被关闭,因为flash
不能跟上这样的刷屏节奏。也就是说SetInterval将很精确的配合时间间隔,而不
管flash能否跟的上。因此,flash跟不上SetInterval的函数调用,这个函数将不会
被执行了。
应用:
因为SetInterval和onEnterFrameevent很相象。从技术的角度说,SetInterval可
以应用多次。当然和普通的方法有些不同,setInterval最好和count-down或其他
与时间相关的命令来应用。
displayTime = 30;
countDown = function(message){
displayTime–;
if (displayTime == 0){
clearInterval(timer);
trace("Times Up!");
}
}
timer = setInterval(countDown, 1000);
这儿,每秒displayTime 将自减一直到为0。一旦为0,countDown函数将清除自身
的时间间隔,避免时间在为负数的情况下继续计算。
你得小心的使用这些计时用法,特别是在游戏里。知道了setInterval独立于时间轴
来运行,使用低性能电脑的人将因为机器缓慢的运行速度而不能完成指令。这中情
况下最好用基于时间轴的时间计算。
另一个setInterval的应用就是使得MC在独立于主时间轴的情况下运行。例如,它
将使得mc在12帧/秒的影片里以5帧/秒甚至30帧/秒的速度运行。通过和
updateAfterEvent()结合,clearInterval将在下一帧到来之前快速刷新屏幕来显示
一些东西。 例子:
fastFrames = function(){
myMovie_mc.nextFrame();
updateAfterEvent();
}
speedyID = setInterval(fastFrames, 40);
在四十毫秒的间隔内,myMovie_mc将以25帧/秒的速度运行。但是flash也有它自身
的限制。如果你设定的间隔太快让flash无法跟上,它将以自身最快的速度运行,你
的子函数将不能执行。
Loading是现实中应用setInterval的又一个例子。用它的理由是你要做个preload
的效果而不去混淆onEnterFrame事件。setInterval将通过自身,让你建立一个独
一无二的函数来检测swf被load了没有,然后播放。只有在这里,我们不用等待swf
所有字节都被载入,仅仅需要10帧,当他们可以提供时,开始播放。例子;
loadMovieNum("loadme.swf",1);
checkLoaded = function(){
if (_level1._framesloaded >= 10){
_level1.gotoAndStop(10);
clearInterval(intervalID);
}
}
intervalID = setInterval(checkLoaded, 50);
我们可以使用setInterval来模拟javascript中的setTimeout函数。例子;
_global.setTimeout = function(a,b,c, args){
// for a basic function call:
if (typeof arguments[0] == "function"){
args = arguments.slice(2);
var ID, func = function(){
a.apply(null, args);
clearInterval(ID);
}
ID = setInterval(func, b,args);
// for an object method call:
}else{
args = arguments.slice(3);
var ID, func = function(){
a.apply(a, args);
clearInterval(ID);
}
ID = setInterval(func, c, args);
}
return ID;
}
_global.clearTimeout = clearInterval;
结论:
尽管setInterval作为一个崭新的MX里的函数,并不能给予我们太多的激动。实际是
它是独立于帧的东西,可以抛弃一些flash影片里的累赘。无论如何,setInterval
是一个强劲的力量。远远不同于笨拙的flash5里的getTimer or date。现在,
flash里的命令可以在一小段时间里精确的更容易的运行。你使用的函数将更贴近你
的要求。
setInterval在preload里的应用举例:
loadMovie("movie1.swf","mc1");
loadMovie("movie2.swf","mc2");
loadMovie("movie3.swf","mc3");
loadMovie("movie4.swf","mc4");
loaderInterval=setInterval(loadChecker,100);
function loadChecker(){
dataLoaded=mc1.getBytesLoaded()+mc2.getBytesLoaded()+
mc3.getBytesLoaded()+mc4.getBytesLoaded();
dataTotal=mc1.getBytesTotal()+mc2.getBy[]tesTotal()+
mc3.getBytesTotal()+mc4.getBytesTotal();
if(dataLoaded>=dataTotal &&dataLoaded > 0)
{ mc1.gotoAndPlay(2);
mc2.gotoAndPlay(2);
mc3.gotoAndPlay(2);
mc4.gotoAndPlay(2);
clearInterval(loaderInterval);
}
//进度条的尺寸:
_root.loaderBar._xscale=(dataLoaded/dataTotal)*100;
}