SetInterval的用法详解

作者 Trevor McCauley (a.k.a. senocular)
Version: Flash MX
Level: Beginner - Intermediate

简介:在flash中所有的东西都基于事件(event)。这些事件可以是用户触发的诸

如onMouseDown event 或者是按下按钮,还可以是flash时间线上帧的移动的结果。
利用后着的例子,常常是运用onEnterFrame event ,它允许一个命令或一系列命令

在每一帧被触发。运用这些AS,可以使得动画和主时间线同步发生。但是,随主时

间线的播放进程严格的基于影片设定的帧频或者说FPS (Frames Per Second) 。这

意味着你使用onEnterFrame event 事件的动画将在每一帧以每秒发生FPS次的方式

播放。例如,你的电影的帧频是12frame/S,那么onEnterFrame event就将一秒发生

12次。SetInterval 是FLASH MX的一种函数。它允许你使用自己乐意的基于时间的

事件,有点类似onEnterFrame event,但它是你自己定义的时间间隔。
为了避免所有的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);">Click here</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);">Click here</a><br>
<a href="javascript: clearTimeout(ID);">Kill alert</a>
如果Kill alert在点击连接后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);">Click here</a><br>
<a href="javascript: clearTimeout(ID);">Kill alert</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后的参数,用来传递给函数。这里,就是
"Interval called"。看到的效果是,函数被调用后,在output窗口将看到Interval 

called。
第一种用法基于直接调用函数。但很多时候需要调用一个对象函数,包括对象的属

性。第二种方法就派上了用处。
myObj = new Object();
myObj.DisplayTrace = function(message){
trace(message);
}
ID = setInterval(myObj, "DisplayTrace", 2000, "Interval called");
这里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和onEnterFrame event很相象。从技术的角度说,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[b].apply(a, args);
clearInterval(ID);
}
ID = setInterval(func, c, args);
}
return ID;
}
_global.clearTimeout = clearInterval;

结论:
尽管setInterval作为一个崭新的MX里的函数,并不能给予我们太多的激动。实际是

它是独立于帧的东西,可以抛弃一些flash影片里的累赘。无论如何,setInterval

是一个强劲的力量。远远不同于笨拙的flash 5里的getTimer or date。现在,

flash里的命令可以在一小段时间里精确的更容易的运行。你使用的函数将更贴近你

的要求。 

windwolf 2006-4-14 05:20 AM 
 
补充一下

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.getBytesTotal()+
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;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值