上一篇 | 下一篇

定时对象

发布: 2007-1-25 17:10 | 作者: David Berge | 来源: 译自director-online.com | 查看: 227次

  原著:David Berger   翻译:jerrowolf 奥古多媒体1O O:g`w

g.U$N+yQ8t   我们经常要作这样的事情,每隔一段时间就去触发一个事件。例如,当你组建一个shockwave电影时,可能会要每隔2秒钟去测试一下一个特定成员的mediaReady属性以便于判断何时它可以使用。一旦它准备好了,就不需要再判断了。

5B7Z ]!w J3]   编写这样的程序,一般会用全局变量或者对象和行为属性来跟踪时间变化。有时用到the timer。这样的脚本经常会对演员表进行操作,并且通过帧的步进来传递消息。这样的方法经常会产生bug,并且很难阅读。在Director8当中,我们可以利用定时对象来探索一个比较明智的解决方案。

e4fAO*~   基本的方法就是,你先创建一个定时对象。然后告知它在给定的时间间隔内执行什么样的句柄。定时对象会被加入到timeoutlist列表,这个列表是系统属性,是当前激活的定时对象的线形列表。列表中的每一个定时对象都会自动地执行,除非你用forget方法将其移除。创建定时对象使用new方法。 奥古多媒体 t7~F.j Dm)L

timeout (‘‘thetimeOutName‘‘).new (1000, #theHandlerToCall, theTarget)

"ox@Gp'b   每一个定时对象都用一个字符串作为名字来标识。上例中定时对象的名字是‘‘thetimeOutName‘‘.new方法中的第二个参数用来指出,当指定时间间隔之后,需要执行的句柄。这个句柄名被储存在对象的timeoutHandler属性中。注意你必须把句柄名写成符号形式。 奥古多媒体ONaXl

  第一个参数指出经过多长时间才执行timeoutHandler句柄。也就是时间间隔。格式是毫秒,在上例中,每隔一秒钟执行一次句柄。这个时间存储在对象的period属性当中。 奥古多媒体OX[$E#p

  第三个参数指定timeoutHandler句柄的位置。他被存储在定时对象的the target 属性当中,如果the target为空,则Director会在电影脚本中寻找相应的句柄,我更喜欢建立一个父脚本,把我想要调用的句柄放在父脚本中,这样我可以从父脚本的一个实例当中调用句柄,你可以使用me来做为the target。 奥古多媒体 fCJ#s@Q n%R#t

  在消息窗口中试着输入以下代码:

A-s+N1U#~ DS)O6LV P timeout (‘‘thetimeOutName‘‘).new (1000, #theHandlerToCall, theTarget)
^#h0R2r@ `:Q E9]put the timeoutlist
b)V6|]1Y;gA-- [timeOut(‘‘thetimeOutName‘‘)]

xk*N"~$?   以下是一个电影中的代码(带注释) 奥古多媒体l7Z@3a ?^,P

on prepareMovie
/SLn9{}B9F'L--创建定时对象
r0Y&w6j;Qy#h,KDtimeout (‘‘annoyTheUser‘‘).new (5000, #callAlert)
N8s)mgj gAqend 奥古多媒体nv:Hz/Y#@4i

奥古多媒体2S3P#O'}c;nX
on callAlert
i#u Hh0KF];[alert ‘‘Click the button.‘‘
:N7xnB'F)fCend

&oH h+OZ xY on buttonClicked
G-]^,IBPd B--点击按钮时,从timeoutlist中清除掉这个定时对象。
^&s$|re"AOEttimeout (‘‘annoyTheUser‘‘).forget ()
$SA"L*Z L s*Ch2{4{${end

|:`p NOK 奥古多媒体1bIfzt&Z6^2J1K
  定时对象在进行异步操作时尤其有用,例如在netlingo中的很多调用,典型的调用这样写:

/sk2o4x-y#I3bY gnetid = getnettext (‘‘http://www.mysite.com/mytext.htm‘‘)

/X6eyzV6|0\   定时对象可以周期性地检查是否操作已经进行,以往我们需要不听地在exitframe句柄中判断,现在你可以用一个定时对象来检查,在调用getNetText后面加上一个定时对象,然后在电影脚本中加入一个句柄,调用这个句柄时就检查是否进行了某种操作。

*eo6M,y,o   代码如下:

5GA'Cd,S7{\ timeout (‘‘checkNetOperation‘‘).new (1000, #checktheNetOperation) 奥古多媒体ca]Z'p8[!sA

on checktheNetOperation 奥古多媒体,o|R }JR
if netdone (gnetid) then
I-}![ cE--if the operation is done kill the timeout object奥古多媒体-F-zTrF s tO
timeout (‘‘checkNetOperation‘‘).forget () 奥古多媒体 l%nrCo,yb
if neterror (gnetid) = ‘‘OK‘‘ then奥古多媒体5k5JW tD
res=netTextResult (gnetid)奥古多媒体"[9]v%Ss+hQ!x^
--do the rest of the processing
)rNR RjrD(nprocess res
;kreD5aend if
#~)n6}hFend if
Z4u1{Vj)fzzend

'vgY3|qb#A"p^   我还经常使用定时对象来在两个shockwave电影之间传递信息。第一个电影中添加了一个定时对象,它每隔几秒钟调用一个句柄,这个句柄用来检查由getPref方法指定名字的文件是否存在,当第二个电影需要传递数据时,它将数据写入指定文件中,当第一个电影从文件中取得数据时,马上通过forget方法去掉定时对象。总之,定时对象非常有用,如果你还在使用Director7,那么,赶紧升级来体验一下这些新东西吧。
7t@ W7u&{Y2x CC奥古多媒体)vT-Z e&uq

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


最新歌曲
转机 放生 黄玫瑰 摇啊摇 那滋味 擦肩而过 你若成风 幸福一辈子 依然在一起 吻得太逼真 感动天感动地 坐上火车去拉萨 怎么会狠心伤害我
心碎 冲动 小太阳 别碰我 蒲公英 爱情小偷 只要不亏 一定要爱你 等爱的玫瑰 无情的温柔 北极星的眼泪 最后一次的温柔 亲爱的那不是爱情
光荣 火花 下雨天 我可以 樱花草 为你写诗 独家记忆 再见小时候 寂寞才说爱 忘不掉的伤 爱上你是个错 第三者的第三者 孤独的时候可以抱你
假如 城府 是非题 有缘人 舍不得 我的答铃 只欠秋天 外滩十八号 越爱越难过 123木头人 爱走了心碎了 爱上你是我的错 爱情里没有谁对谁错